RFR: 8332856: C2: Add new transform for bool eq/ne (cmp (and (urshift X const1) const2) 0) [v2]

Dean Long dlong at openjdk.org
Wed May 29 00:45:02 UTC 2024


On Tue, 28 May 2024 20:11:35 GMT, Tobias Hotz <duke at openjdk.org> wrote:

>> This PR adds a new ideal optimization for the following pattern:
>> 
>> public boolean testFunc(int a) {
>>     int mask = 0b101;
>>     int shift = 12;
>>     return ((a >> shift) & mask) == 0;
>> }
>> 
>> Where the mask and shift are constant values and a is a variable. For this optimization to work, the right shift has to be idealized to a unsinged right shift earlier in the pipeline, which here: https://github.com/openjdk/jdk/blob/b92bd671835c37cff58e2cdcecd0fe4277557d7f/src/hotspot/share/opto/mulnode.cpp#L731
>> If the shift is already an unsiged bit shift, it works as well.
>> On AMD64 CPUs, this means that this whole line computation can be reduced to a simple `test` instruction.
>
> Tobias Hotz has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - LF endings...
>  - Add a benchmark to measure effect of new ideal transformation

It seems like this could hurt some platforms (or at least require an additional temp register), if the shifted value we AND with can no longer be encoded as an immediate (RISC CPUs can't encode arbitrary immediates in one instruction).
Also, I'm wondering if this could be implemented in the backend with a appropriate match rule pattern in the .ad file.

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

PR Comment: https://git.openjdk.org/jdk/pull/19310#issuecomment-2136320901


More information about the hotspot-compiler-dev mailing list