RFR: 8323220: Reassociate loop invariants involved in Cmps and Add/Subs [v3]

Emanuel Peter epeter at openjdk.org
Mon Jan 22 09:16:28 UTC 2024


On Sat, 20 Jan 2024 00:36:41 GMT, Joshua Cao <duke at openjdk.org> wrote:

>> // inv1 == (x + inv2) => ( inv1 - inv2 ) == x
>> // inv1 == (x - inv2) => ( inv1 + inv2 ) == x
>> // inv1 == (inv2 - x) => (-inv1 + inv2 ) == x
>> 
>> 
>> For example,
>> 
>> 
>> fn(inv1, inv2)
>>   while(...)
>>       x = foobar()
>>       if inv1 == x + inv2
>>            blackhole()
>> 
>> 
>> We can transform this into
>> 
>> 
>> fn(inv1, inv2)
>>   t = inv1 - inv2
>>   while(...)
>>       x = foobar()
>>       if t == x
>>            blackhole()
>> 
>> 
>> Here is an example: https://github.com/openjdk/jdk/blob/b78896b9aafcb15f453eaed6e154a5461581407b/src/java.base/share/classes/java/lang/invoke/LambdaFormEditor.java#L910. LHS `1` and RHS `pos` are both loop invariant
>> 
>> Passes tier1 locally on Linux machine. Passes GHA on my fork.
>
> Joshua Cao has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Assert for n2. Variables for n1/n2 opcode. More concise comments.
>   Overflow/random tests

Thanks for adding some random arguments!

One more nice thing might be result verification, i.e. verify that the generated code actually returns the correct results, for example the expected `i`.

test/hotspot/jtreg/compiler/loopopts/InvariantCodeMotionReassociateCmp.java line 163:

> 161:             }
> 162:         }
> 163:     }

Why could you not have random arguments here?

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

Changes requested by epeter (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/17375#pullrequestreview-1835929842
PR Review Comment: https://git.openjdk.org/jdk/pull/17375#discussion_r1461544295


More information about the hotspot-compiler-dev mailing list