On Wed, Aug 19, 2026 at 1:16 AM Andrew MacLeod <[email protected]> wrote:
>
> My patch for 126329 allows early removal of builtin_unreachable to
> proceed by replacing dead statements with an assignment to zero instead
> of removing them.
>
> In theory that was safe because there were no uses of the name in the
> IL. The fallout was that if there was an existing equivalence or
> relation with some other ssa name, this made those equivalences and
> relations now relative to [0, 0]. oops.
>
> I looked at a few options, and they all seemed a bit hacky.. In the end,
> Ive provided a way to remove all relevant information about a range from
> all the various components... Ranger, the relation oracle, the inferred
> range oracle, and gori. Although this might seem like a bit of
> overkill, it fills a gap that was uncovered a few months ago with
> reset_flow_sensitive_info.
>
> There are uses of reset_flow_sensitive_info (name) sprinkled around the
> compiler which currently kills just the SSA_NAME_RANGE_INFO for an SSA
> NAME. It won't affect ranger or any other component, and this may lead
> to behaviour the developer is not expecting.
>
> With this patch, a range_query object now has a reset_range_info ()
> which is called by reset_flow_sensitive_info () and corrects this
> situation. It will clear any range info from the current range object,
> as well as the various oracles.. relations, inferred ranges, and gori.
> Its a bit heavy handed but does a full job. I had considered just
> clearing some of the cache flags, but if the ssa_name were to be used
> again (and other use cases may expect that) some of the old relations
> would have popped back into existence. This now expunges all of them.
> Overall compile time building gcc is actually a wash.
>
> The DCE fix for this PR now simply calls reset_flow_sensitive_info on
> the ssa-name when it rewrites the statement to be an assignment of 0.
> This clears all the information that may cause issues, and life is
> hopefully good again.
>
> Bootstraps on x86_64-pc-linux-gnu with no regressions. Pushed.
So
+void
+infer_range_manager::clear(tree name)
+{
...
+ // Check each basic block for an inferred range.
+ basic_block bb;
+ FOR_EACH_BB_FN (bb, cfun)
+ {
ouch. This means we're possibly walking the CFG num-ssa-names times?
Can the walk be constrained given the definition point of 'name' at least?
That feels like very bad(TM).
Did you think of a global SSA-generation-number that could be checked
against one recorded in an equivalence?
As all of this is for this early gcc_unreachable () removal it really feels like
spending time on a hackish solution there in isloation would make sense?
OTOH reset_flow_sensitive_info also expects to clear relations - it is used
for example when a definition is moved across a condition formerly guarding it.
Richard.
> Andrew