On Mon, Jan 24, 2022 at 11:55 PM Martin Sebor <mse...@gmail.com> wrote: > > The pointer_query algorithm fails when it's unable to determine > the provenance of an pointer SSA variable. A failure prevents it > from making a record of the variable in the cache. Although this > doesn't happen often, one common cause of failures is PHI nodes: > e.g., because one of its arguments references the PHI itself, or > an undefined variable. Because a failed SSA_NAME isn't added to > the cache, the computation that led up to its failure is repeated > on each interesting use of the variable. This is computationally > wasteful and can cause excessive CPU usage in pathological cases > like in the test case in PR 104203. > > To avoid the problem the attached patch changes the logic for PHI > arguments and nodes to cache the most conservative result on such > a failure. It treats such a pointer as pointing into the middle > of an object of maximum size (same as under some other conditions). > > In addition, the patch also adds a new timer variable to > the warn_access pass to make these problems easier in the future > to track down.
LGTM. > There are a number of other conditions under which point_query > fails. Even though the same approach could be used to replace > all those, I did not make the change in this patch. It's probably worth fixing them. Btw, I wonder whether caching fails as true fails would work as well though caching a conservative answer of course is fine. > Tested on x86_64-linux. > > Martin > > PS This solution relies on the pointer_query instance having caching > enabled. Two warning passes run without a cache: -Warray-bounds in > VRP and -Wrestrict in the wrestrict pass. I can look into enabling > it for GCC 12 if there's concern that they might be impacted. Please. There is IMHO no reason to not use the cache - for PHIs you can run into the same PHI arg def from multiple edges and thus you'll do unnecessary work even when you just do a single query for the toplevel API. Richard.