[PATCH][GCC 14] PR tree-optimization/123300 - Early builtin_unreachable removal must examine dependencies.
Andrew MacLeod
amacleod@redhat.com
Tue Jan 13 21:38:24 GMT 2026
On 1/12/26 10:23, Andrew MacLeod wrote:
>
> On 1/6/26 12:35, Andrew MacLeod 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?
>>
>> Andrew
>>
>>
> Patch adjusted and applied to GCC-14. OK for branch or not?
>
> Andrew
GCC15 patch was approved, is the same for GCC 14 as well?
Thanks
Andrew
More information about the Gcc-patches
mailing list