[jdk17] RFR: 8269230: C2: main loop in micro benchmark never executed [v2]
Maurizio Cimadamore
mcimadamore at openjdk.java.net
Wed Jun 30 11:17:04 UTC 2021
On Wed, 30 Jun 2021 09:10:38 GMT, Roland Westrelin <roland at openjdk.org> wrote:
>> The benchmark loop is roughly:
>>
>> for (int i = 0; i < limit; i++) {
>> if (!(i < max_jint && i > min_jint)) {
>> uncommon_trap();
>> }
>> }
>>
>> which IfNode::fold_compares() tranforms to:
>>
>> for (int i = 0; i < limit; i++) {
>> if (!(i - min_jint - 1 <u -2)) {
>> uncommon_trap();
>> }
>> }
>>
>> Range elimination then adjusts loop limits so the unsigned comparison
>> can be removed. The new limit is:
>>
>> min(limit, max(-2 + min_jint + 1, min_jint)) = min(limit, min_jint) = min_jint
>>
>> and the main loop is never executed.
>>
>> The logic that protects against overflows during range check
>> elimination is what causes the main loop to never be executed. As a
>> fix, I propose delaying IfNode::fold_compares() if the resulting test
>> compares with a potential negative number which could then cause RC
>> overflow code to trigger. I think that would preserve the most
>> interesting cases for IfNode::fold_compares() when it comes to range
>> check elimination:
>>
>> i >= 0 && i < array.length
>
> Roland Westrelin has updated the pull request incrementally with one additional commit since the last revision:
>
> benchmark
I tried this patch on my machine - I can confirm it solves the problem, and that the benchmark shows similar numbers in all iterations now. Thanks for taking care of this!
-------------
PR: https://git.openjdk.java.net/jdk17/pull/156
More information about the hotspot-compiler-dev
mailing list