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