RFR: 8366888: C2: incorrect assertion predicate with short running long counted loop [v3]
Roland Westrelin
roland at openjdk.org
Tue Oct 28 10:13:36 UTC 2025
On Mon, 13 Oct 2025 15:15:56 GMT, Roland Westrelin <roland at openjdk.org> wrote:
>> 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.
>
> Roland Westrelin has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains eight additional commits since the last revision:
>
> - review
> - Merge branch 'master' into JDK-8366888
> - Update src/hotspot/share/opto/predicates.cpp
>
> Co-authored-by: Christian Hagedorn <christian.hagedorn at oracle.com>
> - Update src/hotspot/share/opto/predicates.cpp
>
> Co-authored-by: Christian Hagedorn <christian.hagedorn at oracle.com>
> - Update src/hotspot/share/opto/loopnode.cpp
>
> Co-authored-by: Christian Hagedorn <christian.hagedorn at oracle.com>
> - Update src/hotspot/share/opto/loopnode.cpp
>
> Co-authored-by: Christian Hagedorn <christian.hagedorn at oracle.com>
> - whitespaces
> - fix
Anyone for a second review?
-------------
PR Comment: https://git.openjdk.org/jdk/pull/27250#issuecomment-3455628712
More information about the hotspot-compiler-dev
mailing list