RFR: 8341781: Improve Min/Max node identities [v3]

Jasmine Karthikeyan jkarthikeyan at openjdk.org
Thu Oct 31 16:53:57 UTC 2024


> Hi all,
> This patch implements some missing identities for Min/Max nodes. It adds static type-based operand choosing for MinI/MaxI, such as the ones that MinL/MaxL use. In addition, it adds simplification for patterns such as `Max(A, Max(A, B))` to `Max(A, B)` and `Max(A, Min(A, B))` to `A`. These simplifications stem from the [lattice identity rules](https://en.wikipedia.org/wiki/Lattice_(order)#As_algebraic_structure). The main place I've seen this pattern is with MinL/MaxL nodes created during loop optimizations. Some examples of where this occurs include BigInteger addition/subtraction, and regex code. I've run some of the existing benchmarks and found some nice improvements:
> 
>                                                                 Baseline                    Patch
> Benchmark                                 Mode  Cnt       Score       Error  Units    Score       Error  Units  Improvement
> BigIntegers.testAdd                       avgt   15      25.096 ±     3.936  ns/op   19.214  ±    0.521  ns/op  (+ 26.5%)
> PatternBench.charPatternCompile           avgt    8     453.727 ±   117.265  ns/op   370.054 ±   26.106  ns/op  (+ 20.3%)
> PatternBench.charPatternMatch             avgt    8     917.604 ±   121.766  ns/op   810.560 ±   38.437  ns/op  (+ 12.3%)
> PatternBench.charPatternMatchWithCompile  avgt    8    1477.703 ±   255.783  ns/op  1224.460 ±   28.220  ns/op  (+ 18.7%)
> PatternBench.longStringGraphemeMatches    avgt    8     860.909 ±   124.661  ns/op   743.729 ±   22.877  ns/op  (+ 14.6%)
> PatternBench.splitFlags                   avgt    8     420.506 ±    76.252  ns/op   321.911 ±   11.661  ns/op  (+ 26.6%)
> 
> I've added some IR tests, and tier 1 testing passes on my linux machine. Reviews would be appreciated!

Jasmine Karthikeyan has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains four additional commits since the last revision:

 - Add platform checks to IR
 - Merge branch 'master' into minmax_identities
 - Suggestions from review
 - Min/Max identities

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/21439/files
  - new: https://git.openjdk.org/jdk/pull/21439/files/b4b96143..39f7d047

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

  Stats: 292091 lines in 2825 files changed: 243748 ins; 34186 del; 14157 mod
  Patch: https://git.openjdk.org/jdk/pull/21439.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/21439/head:pull/21439

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


More information about the hotspot-compiler-dev mailing list