RFR: 8323972: C2 compilation fails with assert(!x->as_Loop()->is_loop_nest_inner_loop()) failed: loop was transformed

Roland Westrelin roland at openjdk.org
Thu Feb 22 14:41:09 UTC 2024


Long counted loop are transformed into a loop nest of 2 "regular"
loops and in a subsequent loop opts round, the inner loop is
transformed into a counted loop. The limit for the inner loop is set,
when the loop nest is created, so it's expected there's no need for a
loop limit check when the counted loop is created. The assert fires
because, when the counted loop is created, it is found that it needs a
loop limit check. The reason for that is that the limit is
transformed, between nest creation and counted loop creation, in a way
that the range of values of the inner loop's limit becomes
unknown. The limit when the nest is created is:


 111  ConL  === 0  [[ 112 ]]  #long:-9223372034707292158
 106  Phi  === 105 20 94  [[ 112 ]]  #long:9223372034707292160..9223372034707292164:www !orig=72 !jvms: TestInaccurateInnerLoopLimit::test @ bci:12 (line 40)
 112  AddL  === _ 106 111  [[ 122 ]]  !orig=[110]
 122  ConvL2I  === _ 112  [[ ]]  #int


The type of 122 is `2..6` but it is then transformed to:


 106  Phi  === 105 20 154  [[ 191 130 137 ]]  #long:9223372034707292160..9223372034707292164:www !orig=[72] !jvms: TestInaccurateInnerLoopLimit::test @ bci:12 (line 40)
 191  ConvL2I  === _ 106  [[ 196 ]]  #int
 195  ConI  === 0  [[ 196 ]]  #int:max-1
 196  SubI  === _ 195 191  [[ 201 127 ]]  !orig=[123]


That is the `(ConvL2I (AddL ...))` is transformed into a `(SubI
(ConvL2I ))`. `ConvL2I` for an input that's out of the int range of
values returns TypeInt::INT and the bounds of the limit are lost. I
propose adding a `CastII` after the `ConvL2I` so the range of values
of the limit doesn't get lost.

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

Commit messages:
 - test & fix

Changes: https://git.openjdk.org/jdk/pull/17965/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=17965&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8323972
  Stats: 51 lines in 2 files changed: 50 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/17965.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/17965/head:pull/17965

PR: https://git.openjdk.org/jdk/pull/17965


More information about the hotspot-compiler-dev mailing list