RFR: 8332856: C2: Add new transform for bool eq/ne (cmp (and (urshift X const1) const2) 0) [v2]
Quan Anh Mai
qamai at openjdk.org
Sun Jun 30 06:15:22 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
This idealisation looks deeply into the structure of the node's subtree, have you verified that the node is pushed correctly into the waitlist of IGVN?
For example, given `((x >> y) & z) == 0`, if `y` was not a constant and is just idealised into one, then you need to push the `BoolNode` into the waitlist.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/19310#issuecomment-2198448461
More information about the hotspot-compiler-dev
mailing list