RFR: 8324655: Identify integer minimum and maximum patterns created with if statements [v2]

Jasmine Karthikeyan jkarthikeyan at openjdk.org
Fri Jan 26 16:05:45 UTC 2024


> Hi all, I've created this patch which aims to convert common integer mininum and maximum patterns created using if statements into Min and Max nodes. These patterns are usually in the form of `a > b ? a : b` and similar, as well as patterns such as `if (a > b) b = a;`. While this transform doesn't generally improve code generation it's own, it simplifies control flow and creates new opportunities for vectorization.
> 
> I've created a benchmark for the PR, and I've attached some data from my (Zen 3) machine:
> 
>                                                 Baseline                     Patch            Improvement
> Benchmark                   Mode   Cnt  Score      Error  Units    Score       Error  Units
> IfMinMax.testReductionInt   avgt   15  500.307 ±  16.687  ns/op    509.383 ±  32.645  ns/op   (no change)*
> IfMinMax.testReductionLong  avgt   15  493.184 ±  17.596  ns/op    513.587 ±  28.339  ns/op   (no change)*
> IfMinMax.testSingleInt      avgt   15    3.588 ±   0.540  ns/op      2.965 ±   1.380  ns/op   (no change)
> IfMinMax.testSingleLong     avgt   15    3.673 ±   0.128  ns/op      3.506 ±   0.590  ns/op   (no change)
> IfMinMax.testVectorInt      avgt   15  340.425 ±  13.123  ns/op     59.689 ±   7.509  ns/op   + 5.7x
> IfMinMax.testVectorLong     avgt   15  326.420 ±  15.554  ns/op    117.190 ±   5.622  ns/op   + 2.8x
> 
> 
> * After writing this benchmark I discovered that the compiler doesn't seem to create some simple min/max reductions, even when using Math.min/max() directly. Is this known or should I create a followup RFE for this?
> 
> The patch passes tier 1-3 testing on linux x64. Reviews or comments would be appreciated!

Jasmine Karthikeyan has updated the pull request incrementally with one additional commit since the last revision:

  Don't transform highly predictable branches

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/17574/files
  - new: https://git.openjdk.org/jdk/pull/17574/files/8c85ab6a..bafabad2

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

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

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


More information about the hotspot-compiler-dev mailing list