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();