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

Jasmine Karthikeyan jkarthikeyan at openjdk.org
Fri Jan 26 15:54:25 UTC 2024


On Thu, 25 Jan 2024 18:15:21 GMT, Jasmine Karthikeyan <jkarthikeyan at openjdk.org> wrote:

> 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!

I'm not super sure how to do that cleanly either, and it seems some backends (like ppc) don't use cmovs to implement min/max in all cases as well. I think in general it's a good idea to gate the transform based on the if-block probability though, so I'll go ahead and make that change.

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

PR Comment: https://git.openjdk.org/jdk/pull/17574#issuecomment-1912286243


More information about the hotspot-compiler-dev mailing list