RFR: 8261308: C2: assert(inner->is_valid_counted_loop(T_INT) && inner->is_strip_mined()) failed: OuterStripMinedLoop should have been removed

Roland Westrelin roland at openjdk.java.net
Tue Feb 23 08:09:50 UTC 2021


The inner counted loop of the test case starts at 1 and stops at 1 so
runs for one iteration. A counted loop is created for it. The iv Phi
is found to be the constant 1 and its type is set by:

l->phi()->as_Phi()->set_type(l->phi()->Value(&_igvn));

in PhaseIdealLoop::is_counted_loop() but it's not replaced by the
constant 1 yet so the counted loop's shape is preserved.

IdealLoopTree::do_one_iteration_loop() runs but doesn't optimize the
loop because the trip count is not set to 1. The loop contains a range
check and range check elimination is applied. That causes the loop
exit test to be adjusted with a MinI(..) expression. When IGVN runs
next, the phi is replaced with 1 but because the exit test was
changed, IGVN can't prove it always fails. So the loop is not removed
which causes the assert failure as loop opts progress.

The fix I propose is for IdealLoopTree::do_one_iteration_loop() to
remove the 1 iteration loop. The reason it doesn't happen is that
IdealLoopTree::compute_trip_count() doesn't set the trip count because
it finds a zero trip count: limit - init = 1 - 1 = 0. All loops, once
entered execute at least once. So I think, it's safe to set the trip
count to 1 in those cases.

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

Commit messages:
 - whitespaces
 - test
 - fix

Changes: https://git.openjdk.java.net/jdk/pull/2529/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2529&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8261308
  Stats: 66 lines in 2 files changed: 65 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2529.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2529/head:pull/2529

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


More information about the hotspot-compiler-dev mailing list