Rewrite min/max backport calls on numbers to Math

Test: tools/test.py --no-internal -v *Backport*Test*
Change-Id: I4bb035d0628c9aff395441e61bc3c4cbb08529fd
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index dc61413..84ca11d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -427,13 +427,13 @@
       name = factory.createString("max");
       proto = factory.createProto(factory.intType, factory.intType, factory.intType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, IntegerMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // int Integer.min(int a, int b)
       name = factory.createString("min");
       proto = factory.createProto(factory.intType, factory.intType, factory.intType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, IntegerMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // int Integer.sum(int a, int b)
       name = factory.createString("sum");
@@ -454,13 +454,13 @@
       name = factory.createString("max");
       proto = factory.createProto(factory.doubleType, factory.doubleType, factory.doubleType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, DoubleMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // double Double.min(double a, double b)
       name = factory.createString("min");
       proto = factory.createProto(factory.doubleType, factory.doubleType, factory.doubleType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, DoubleMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // double Double.sum(double a, double b)
       name = factory.createString("sum");
@@ -487,13 +487,13 @@
       name = factory.createString("max");
       proto = factory.createProto(factory.floatType, factory.floatType, factory.floatType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, FloatMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // float Float.min(float a, float b)
       name = factory.createString("min");
       proto = factory.createProto(factory.floatType, factory.floatType, factory.floatType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, FloatMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // float Float.sum(float a, float b)
       name = factory.createString("sum");
@@ -547,13 +547,13 @@
       name = factory.createString("max");
       proto = factory.createProto(factory.longType, factory.longType, factory.longType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, LongMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // long Long.min(long a, long b)
       name = factory.createString("min");
       proto = factory.createProto(factory.longType, factory.longType, factory.longType);
       method = factory.createMethod(type, proto, name);
-      addProvider(new MethodGenerator(method, LongMethods::new));
+      addProvider(new InvokeRewriter(method, NumericOperations::rewriteToInvokeMath));
 
       // long Long.sum(long a, long b)
       name = factory.createString("sum");
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/DoubleMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/DoubleMethods.java
index 7fcea1e..af13d8b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/DoubleMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/DoubleMethods.java
@@ -18,14 +18,6 @@
     return (int) (l ^ (l >>> 32));
   }
 
-  public static double max(double a, double b) {
-    return Math.max(a, b);
-  }
-
-  public static double min(double a, double b) {
-    return Math.min(a, b);
-  }
-
   public static boolean isFinite(double d) {
     return !Double.isInfinite(d) && !Double.isNaN(d);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethods.java
index dc9ef38..eb545d9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/FloatMethods.java
@@ -17,14 +17,6 @@
     return Float.floatToIntBits(f);
   }
 
-  public static float max(float a, float b) {
-    return Math.max(a, b);
-  }
-
-  public static float min(float a, float b) {
-    return Math.min(a, b);
-  }
-
   public static boolean isFinite(float f) {
     return !Float.isInfinite(f) && !Float.isNaN(f);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/IntegerMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/IntegerMethods.java
index d1e2a85..5c1a8d5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/IntegerMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/IntegerMethods.java
@@ -21,14 +21,6 @@
     return a == b ? 0 : a < b ? -1 : 1;
   }
 
-  public static int max(int a, int b) {
-    return Math.max(a, b);
-  }
-
-  public static int min(int a, int b) {
-    return Math.min(a, b);
-  }
-
   public static int divideUnsigned(int dividend, int divisor) {
     long dividendLong = dividend & 0xffffffffL;
     long divisorLong = divisor & 0xffffffffL;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethods.java
index 21ba2f6..8ed48b3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/LongMethods.java
@@ -25,14 +25,6 @@
     return (int) (l ^ (l >>> 32));
   }
 
-  public static long max(long a, long b) {
-    return Math.max(a, b);
-  }
-
-  public static long min(long a, long b) {
-    return Math.min(a, b);
-  }
-
   public static long divideUnsigned(long dividend, long divisor) {
     // This implementation is adapted from Guava's UnsignedLongs.java and Longs.java.
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericOperations.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericOperations.java
index 94fa9dd..d84858d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericOperations.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericOperations.java
@@ -4,11 +4,20 @@
 import com.android.tools.r8.ir.code.Add;
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.InvokeMethod;
+import com.android.tools.r8.ir.code.InvokeStatic;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.code.Value;
 import java.util.List;
 
 public final class NumericOperations {
+  public static void rewriteToInvokeMath(InvokeMethod invoke, InstructionListIterator iterator,
+      DexItemFactory factory) {
+    InvokeStatic mathInvoke = new InvokeStatic(
+        factory.createMethod(factory.mathType, invoke.getInvokedMethod().proto,
+            invoke.getInvokedMethod().name), invoke.outValue(), invoke.inValues(), false);
+    iterator.replaceCurrentInstruction(mathInvoke);
+  }
+
   public static void rewriteToAddInstruction(InvokeMethod invoke, InstructionListIterator iterator,
       DexItemFactory factory) {
     List<Value> values = invoke.inValues();