RFR: 8307927: C2: "malformed control flow" with irreducible loop
Roland Westrelin
roland at openjdk.org
Fri Jun 16 16:15:18 UTC 2023
The test contains a loop nest with 2 loops. The outer loop is an
irreducible loop. The safepoint for that loop is also in the inner
loop. Because `IdealLoopTree::check_safepts()` ignores irreducible
loops, that safepoint is not marked as being required and is
eliminated from the inner loop. The inner loop is then optimized out
and the outer loop becomes an infinite loop with no safepoint (a
single node loop). That, in turn, causes the loop to be eliminated
because it has not use and the assert fires.
The fix I propose is to make `IdealLoopTree::check_safepts()` work
with irreducible loops. I think
`IdealLoopTree::allpaths_check_safepts()` can be used for that. When
working on this I wondered if that method could be called with a loop
whose head has more than 3 inputs. I couldn't write a test case with
an irreducible loop whose head had more than 3 inputs but I added an
assert in the method and ran some testing. That assert fired so I also
propose to tweak the method so it's robust in that case.
-------------
Commit messages:
- test
Changes: https://git.openjdk.org/jdk/pull/14522/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=14522&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8307927
Stats: 188 lines in 3 files changed: 142 ins; 3 del; 43 mod
Patch: https://git.openjdk.org/jdk/pull/14522.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/14522/head:pull/14522
PR: https://git.openjdk.org/jdk/pull/14522
More information about the hotspot-compiler-dev
mailing list