https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98866

--- Comment #1 from Andrew Macleod <amacleod at redhat dot com> ---
Very large function (16000+ basic blocks) with a lot of exception regions, and
a pattern whereby about 300 pointers are live to all the regions. We spend a
lot of time propagating an unchanging non-zero property around. 

My observation is that if a pointer evaluates to [1, +INF] at its definition
(ie, the address of something), there will never be a meaningful range to
track.

a comparison to NULL will be folded as appropriate, and there is no need to
track [UNDEFINED] on the un-taken edge as the branch will be folded and the
edge removed.  The range will remain [1, +INF] on the other edge.

a comparison to some other pointer will likewise not result in a  change of the
range [1, +INF].  Relational/symbolic tracking could decide to fold the
comparison away or propagate the ssa_name, but again, it will not change the
range from [1, +INF]

I think I can extend the invariant tweak to the cache to also include pointers
which evaluate to [1, +INF] at their definition to be "invariant" as well and
thus not be included in the on-entry cache.

This appears to resolve the time issue.  testing is underway

Reply via email to