On Tue, Jan 6, 2026 at 6:37 PM Andrew MacLeod <[email protected]> wrote:
>
> VRP1 is allowed to remove a __builtin_unreachable () if it determines
> that the other edge in the branch dominates all uses of all exports from
> the block.
>
> ie
>
> <bb 3>:
> x_8 = 1 << i_7;
> if (x_8 <= 0) <<-- this is the branch in BB3
> goto <bb 4>; [INV]
> else
> goto <bb 5>; [INV]
>
> <bb 4> :
> __builtin_unreachable ();
>
> we can remove the branch and edge to bb 4 if we can prove that there
> are no uses of x_8 or i_7 in or dominated by the edge 3->5. We can then
> set the global ranges of i_7 and x_8 and move along.
>
> This PR demonstrates that this normally works, but with rangers ability
> to recompute values, we also have to look at the dependencies of all the
> exports.
>
> IN this case i_7 is defined:
> <bb 7> :
> # i_2 = PHI <i_7(5), n_4(D)(2), i_7(6)>
> i_7 = i_2 + -1;
> if (i_2 > 0)
> goto <bb 3>; [INV]
> else
> goto <bb 8>; [INV]
>
> so althoug the uses of i_7 Are dominated by 3->5, it does NOT dominate
> the use of i_2 in bb_7. When early removal changes the global value of
> i_7, ranger happily recomputes i_2 in the branch and decides that if i_7
> is now [0, +INF], i_2 must always be > 0 and removes the branch.
>
> Which is clearly incorrect. This patch teaches the early removal code
> that it can only remove the unreachable call if x_8, i_7 and ALL the
> dependencies used to calculate either name are ALL dominated by the
> edge. This information is all trivially available in GORI, so its
> noly a minor tweak.
>
> Performance impact over a build of GCC is minimal. a 0.03% slowdown in VRP.
>
> In the PR I mentioned not removing it if any of the dependencies had
> more than a single use, but that turned out to be too limiting. This
> solution works much better.
>
> Bootstraps on x86_64-pc-linux-gnu with no regressions. OK?
OK. I'm somewhat concerned when I see
+ FOR_EACH_GORI_EXPORT_NAME (this, bb, name)
+ {
+ bitmap dep = get_def_chain (name);
+ if (dep)
+ bitmap_ior_into (tmpbit, dep);
in particular for pathological cases (ranger is nowadays involved at -O1 which
we recommend for such code). But we'll see.
Richard.
> Andrew
>
>