[jdk17] RFR: 8269752: C2: assert(false) failed: Bad graph detected in build_loop_late [v2]

Vladimir Kozlov kvn at openjdk.java.net
Tue Jul 13 16:32:37 UTC 2021


On Tue, 13 Jul 2021 14:43:34 GMT, Roland Westrelin <roland at openjdk.org> wrote:

>> Some nodes are sunk out of the outer loop of vMeth(). A CastII node is
>> added on the exit path of the loop to pin the nodes out of the
>> loop. The dominating test of that CastII is:
>> 
>> if (i >= 132) {
>> 
>> so the CastII is updated with type int [132..]
>> 
>> The inner loop is eliminated, the outer loop is turned into a counted
>> loop, pre/main/post loops are created. The CastII control is now a
>> Region that merges paths from the pre/main/post loops. Its data input
>> is a Phi that merges the iv Phis of the 3 loops.
>> 
>> The loop body includes an early exit:
>> 
>> if (i2 != 0) {
>>     vMeth_check_sum += i3;
>>     return;
>> }
>> 
>> That test is guaranteed to be taken at the second iteration. As a
>> consequence, the backedge of the main loop is removed. What's left of
>> the main loop is still guarded by a an entry test that compares the iv
>> value out of the pre loop with an Opaque1 node. The CastII is now only
>> reachable through that test. The iv Phi of the pre loop constant folds
>> to a value that's not >= 132. As a consequence the CastII becomes
>> top. top propagates to other data node and as a consequence a Phi is
>> replaced by its only non top input. That causes the assert failure.
>> 
>> The CastII should not be reachable anymore once the iv Phi of the pre
>> loop has constant folded and the early exit in the main loop is always
>> taken. But because the test that guards the main loop uses an Opaque1,
>> it cannot constant fold. As a fix, I propose removing the Opaque1 once
>> the backedge of the main loop is removed. This allows the entry test
>> to constant fold. The Opaque1 has no purpose anymore given the loop
>> doesn't exist at this point.
>
> Roland Westrelin has updated the pull request incrementally with one additional commit since the last revision:
> 
>   braces

src/hotspot/share/opto/loopnode.cpp line 4948:

> 4946: 
> 4947:   int input = is_main_loop() ? 2 : 1;
> 4948:   bool res = cmpzm->in(input)->Opcode() == Op_Opaque1;

You need to check `input < cmpzm->in(input)` and  `cmpzm->in(input)` for `NULL`. There could be a "dead" path.

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

PR: https://git.openjdk.java.net/jdk17/pull/247


More information about the hotspot-compiler-dev mailing list