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