RFR: 8366888: C2: incorrect assertion predicate with short running long counted loop
Roland Westrelin
roland at openjdk.org
Fri Sep 12 09:10:20 UTC 2025
In:
for (int i = 100; i < 1100; i++) {
v += floatArray[i - 100];
Objects.checkIndex(i, longRange);
}
The int counted loop has both an int range check and a long range. The
int range check is optimized first. Assertion predicates are inserted
above the loop. One predicates checks that:
init - 100 <u floatArray.length
The loop is then transformed to enable the optimization of the long
range check. The loop is short running, so there's no need to create a
loop nest. The counted loop is mostly left as is but, the loop's
bounds are changed from:
for (int i = 100; i < 1100; i++) {
to:
for (int i = 0; i < 1000; i++) {
The reason for that the long range check transformation expects the
loop to start at 0.
Pre/main/post loops are created. Template Assertion predicates are
added above the main loop. The loop is unrolled. Initialized assertion
predicates are created. The one created from the condition:
init - 100 <u floatArray.length
checks the value of `i` out of the pre loop which is 1. That check fails.
The root cause of the failure is that when bounds of the counted loop
are changed, template assertion predicates need to be updated with and
adjusted init input.
When the bounds of the loop are known, the assertion predicates can be
updated in place. Otherwise, when the loop is speculated to be short
running, the assertion predicates are updated when they are cloned.
-------------
Commit messages:
- whitespaces
- fix
Changes: https://git.openjdk.org/jdk/pull/27250/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=27250&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8366888
Stats: 255 lines in 8 files changed: 243 ins; 3 del; 9 mod
Patch: https://git.openjdk.org/jdk/pull/27250.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/27250/head:pull/27250
PR: https://git.openjdk.org/jdk/pull/27250
More information about the hotspot-compiler-dev
mailing list