RFR: 8271340: Crash PhaseIdealLoop::clone_outer_loop

Roland Westrelin roland at openjdk.java.net
Tue Aug 31 15:43:27 UTC 2021


On Tue, 31 Aug 2021 15:31:33 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:

>> The test has a counted loop and an infinite loop. The infinite loop is
>> reachable from multiple paths and its loop head is a Region with more
>> than 3 inputs. One of these paths is from the counted loop. When loop
>> opts run, a NeverBranch is added to the infinite loop that's removed
>> by NeverBranchNode::Ideal() next because in(0) of the NeverBranch is a
>> Region and not a Loop.
>> 
>> When CCP runs, it finds the counted loop exit is never reached because
>> a test in the loop body that depends on a loop phi is never taken. As
>> a consequence nodes along the path from the counted loop end to the
>> infinite loop Region have type top. One of these nodes is a Call
>> node. PhaseCCP::do_transform() should then cause the path between the
>> counted loop and the infinite loop to optimize out but that doesn't
>> happen because do_transform() starts from Root by following inputs.
>> The dead path is only reachable from the infinite loop but the there's
>> no edge between Root and the infinite loop.
>> 
>> IGVN next runs, processes the Call Node, finds it's dead, kills
>> everything around it which causes the OuterStripMinedLoopEnd to loose
>> a projection. That later triggers the crash.
>> 
>> The fix I propose is to be more conservative in
>> NeverBranchNode::Ideal() and to check for a in(0) that's a Region. As
>> a consequence, at CCP time, the infinite loop is reachable from Root.
>> 
>> This change also requires some adjustments to Shenandoah specific code
>> that makes assumptions about the shape of infinite loops.
>
> src/hotspot/share/opto/cfgnode.cpp line 2720:
> 
>> 2718: // Check for no longer being part of a loop
>> 2719: Node *NeverBranchNode::Ideal(PhaseGVN *phase, bool can_reshape) {
>> 2720:   if (can_reshape && !in(0)->is_Region()) {
> 
> I assume this is the actual fix.

Yes, it is. The rest is shenandoah specific.

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

PR: https://git.openjdk.java.net/jdk/pull/5220


More information about the hotspot-compiler-dev mailing list