RFR: 8298353: C2 fails with assert(opaq->outcnt() == 1 && opaq->in(1) == limit) failed

Roland Westrelin roland at openjdk.org
Fri Dec 9 08:45:19 UTC 2022


On Thu, 8 Dec 2022 17:56:08 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:

>> After some unrolling, when C2 runs loop opts with split if enabled
>> after CCP, the limit of the main loop of the counted loop (the second
>> loop in the test) is: limit - 3
>> 
>> That commons with the limit - 3 returned from the first loop. limit -
>> 3 is thus in the first loop's body but only used outside of the
>> loop. It has 3 uses: The return in the first loop, the
>> OpaqueZeroTripGuard and loop exit conditionof the main loop. In the
>> same pass of loop opts, limit-3 is cloned out of the loop 3 times for
>> its 3 uses and unrolling is attempted. Because the OpaqueZeroTripGuard
>> and the loop exit condition now use 2 different nodes (until they
>> common at next igvn), the assert fires.
>> 
>> The fix I propose restores the behavior before the introduction of
>> OpaqueZeroTripGuard which is to not sink a node if it has an Opaque1
>> use.
>
> The fix is good but I suggest to rebase it to new https://github.com/openjdk/jdk20 fork before we start testing it.

Thanks for looking at this @vnkozlov @chhagedorn 
Let me close that one and open jdk 20 PR

-------------

PR: https://git.openjdk.org/jdk/pull/11596


More information about the hotspot-compiler-dev mailing list