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

Tobias Hotz duke at openjdk.org
Tue May 28 20:11:35 UTC 2024


> 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

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/19310/files
  - new: https://git.openjdk.org/jdk/pull/19310/files/d18c9467..3491ceb3

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=19310&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19310&range=00-01

  Stats: 57 lines in 1 file changed: 57 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/19310.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/19310/head:pull/19310

PR: https://git.openjdk.org/jdk/pull/19310


More information about the hotspot-compiler-dev mailing list