RFR: 8263006: Add optimization for Max(*)Node and Min(*)Node

Wang Huang whuang at openjdk.java.net
Thu Apr 15 11:46:43 UTC 2021


* I optimize `max` and `min` by using these identities 
    - op (max(a,b) , min(a,b))=== op(a,b)
    - if op is commutable
    - example : 
      - max(a,b) + min(a,b))=== a + b // op = add
      - max(a,b) * min(a,b))=== a * b  // op = mul
      -  max( max(a,b) , min(a,b)))=== max(a,b) // op = max()
      - min( max(a,b) , min(a,b)))=== max(a,b) // op = min()
* Test case 
  ```java
  /*
   * Copyright (c) 2021, Huawei Technologies Co. Ltd. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.
   *
   * This code is distributed in the hope that it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   * version 2 for more details (a copy is included in the LICENSE file that
   * accompanied this code).
   *
   * You should have received a copy of the GNU General Public License version
   * 2 along with this work; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   * or visit www.oracle.com if you need additional information or have any
   * questions.
   */
  package org.sample;
  
  import org.openjdk.jmh.annotations.Benchmark;
  import org.openjdk.jmh.annotations.*;
  
  import java.util.Random;
  import java.util.concurrent.TimeUnit;
  import org.openjdk.jmh.infra.Blackhole;
  
  @BenchmarkMode({Mode.AverageTime})
  @OutputTimeUnit(TimeUnit.MICROSECONDS)
  public class MyBenchmark {
  
      static int length = 100000;
      static double[] data1 = new double[length];
      static double[] data2 = new double[length];
      static Random random = new Random();
  
      static {
          for(int i = 0; i < length; ++i) {
            data1[i] = random.nextDouble();
            data2[i] = random.nextDouble();
          }
      }
  
      @Benchmark
      public void testAdd(Blackhole bh) {
        double sum = 0;
        for (int i = 0; i < length; i++) {
            sum += Math.max(data1[i], data2[i]) + Math.min(data1[i], data2[i]);
        }
        bh.consume(sum);
      }
  
      @Benchmark
      public void testMax(Blackhole bh) {
          double sum = 0;
          for (int i = 0; i < length; i++) {
              sum += Math.max(Math.max(data1[i], data2[i]), Math.min(data1[i], data2[i]));
          }
          bh.consume(sum);
      }
  
      @Benchmark
      public void testMin(Blackhole bh) {
          double sum = 0;
          for (int i = 0; i < length; i++) {
              sum += Math.min(Math.max(data1[i], data2[i]), Math.min(data1[i], data2[i]));
          }
          bh.consume(sum);
      }
  
      @Benchmark
      public void testMul(Blackhole bh) {
          double sum = 0;
          for (int i = 0; i < length; i++) {
              sum += (Math.max(data1[i], data2[i]) * Math.min(data1[i], data2[i]));
          }
          bh.consume(sum);
      }
  }
  ```

*  The result is listed here:
    before:
    Benchmark                  Mode  Samples    Score  Score error  Units
    o.s.MyBenchmark.testAdd    avgt       10  556.048       32.368  us/op
    o.s.MyBenchmark.testMax    avgt       10  543.065       54.221  us/op
    o.s.MyBenchmark.testMin    avgt       10  570.731       37.630  us/op
    o.s.MyBenchmark.testMul    avgt       10  531.906       20.518  us/op
    after:
    Benchmark                  Mode  Samples    Score  Score error  Units
    o.s.MyBenchmark.testAdd    avgt       10  319.350        9.248  us/op
    o.s.MyBenchmark.testMax    avgt       10  356.138       10.736  us/op
    o.s.MyBenchmark.testMin    avgt       10  323.731       16.621  us/op
    o.s.MyBenchmark.testMul    avgt       10  338.458       23.755  us/op

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

Commit messages:
 - 8263006: Add optimization for Max(*)Node and Min(*)Node

Changes: https://git.openjdk.java.net/jdk/pull/3513/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=3513&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8263006
  Stats: 117 lines in 4 files changed: 107 ins; 4 del; 6 mod
  Patch: https://git.openjdk.java.net/jdk/pull/3513.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/3513/head:pull/3513

PR: https://git.openjdk.java.net/jdk/pull/3513


More information about the hotspot-compiler-dev mailing list