RFR: 8271340: Crash PhaseIdealLoop::clone_outer_loop [v2]
Roland Westrelin
roland at openjdk.java.net
Fri Sep 3 08:06:06 UTC 2021
> 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.
Roland Westrelin has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains three additional commits since the last revision:
- Merge branch 'master' into JDK-8271340
- move test
- fix & test
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/5220/files
- new: https://git.openjdk.java.net/jdk/pull/5220/files/0ece249f..c87b3ee7
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=5220&range=01
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=5220&range=00-01
Stats: 12316 lines in 487 files changed: 6933 ins; 2404 del; 2979 mod
Patch: https://git.openjdk.java.net/jdk/pull/5220.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/5220/head:pull/5220
PR: https://git.openjdk.java.net/jdk/pull/5220
More information about the hotspot-compiler-dev
mailing list