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

Tobias Hotz duke at openjdk.org
Mon Jul 22 19:31:10 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

Thanks for all your reviews! Seems like this is beneficial across a variety of architectures and machines, so I'll keep the approach as-is.
@merykitty I am actually not quite sure how I would verify this or what to do about it. Can you (or someone else) maybe help me with this or guide me in the right direction?

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

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


More information about the hotspot-compiler-dev mailing list