Rewrite "sum" backport calls to directly add
Test: tools/test.py --no-internal -v *Backport*Test*
Change-Id: I2caea424f542ba241f401e6cdfbbfb400570a425
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 61c133e..dc61413 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
@@ -38,6 +38,7 @@
import com.android.tools.r8.ir.desugar.backports.ListMethods;
import com.android.tools.r8.ir.desugar.backports.LongMethods;
import com.android.tools.r8.ir.desugar.backports.MathMethods;
+import com.android.tools.r8.ir.desugar.backports.NumericOperations;
import com.android.tools.r8.ir.desugar.backports.ObjectsMethods;
import com.android.tools.r8.ir.desugar.backports.OptionalMethods;
import com.android.tools.r8.ir.desugar.backports.ShortMethods;
@@ -438,7 +439,7 @@
name = factory.createString("sum");
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::rewriteToAddInstruction));
// Double
type = factory.boxedDoubleType;
@@ -465,7 +466,7 @@
name = factory.createString("sum");
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::rewriteToAddInstruction));
// boolean Double.isFinite(double a)
name = factory.createString("isFinite");
@@ -498,7 +499,7 @@
name = factory.createString("sum");
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::rewriteToAddInstruction));
// boolean Float.isFinite(float a)
name = factory.createString("isFinite");
@@ -558,7 +559,7 @@
name = factory.createString("sum");
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::rewriteToAddInstruction));
// Character
type = factory.boxedCharType;
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 609951a..7fcea1e 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
@@ -26,10 +26,6 @@
return Math.min(a, b);
}
- public static double sum(double a, double b) {
- return 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 9cf349e..dc9ef38 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
@@ -25,10 +25,6 @@
return Math.min(a, b);
}
- public static float sum(float a, float b) {
- return 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 55076e6..d1e2a85 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
@@ -29,10 +29,6 @@
return Math.min(a, b);
}
- public static int sum(int a, int b) {
- return 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 639f8d4..21ba2f6 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
@@ -33,10 +33,6 @@
return Math.min(a, b);
}
- public static long sum(long a, long b) {
- return 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
new file mode 100644
index 0000000..94fa9dd
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/NumericOperations.java
@@ -0,0 +1,24 @@
+package com.android.tools.r8.ir.desugar.backports;
+
+import com.android.tools.r8.graph.DexItemFactory;
+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.NumericType;
+import com.android.tools.r8.ir.code.Value;
+import java.util.List;
+
+public final class NumericOperations {
+ public static void rewriteToAddInstruction(InvokeMethod invoke, InstructionListIterator iterator,
+ DexItemFactory factory) {
+ List<Value> values = invoke.inValues();
+ assert values.size() == 2;
+
+ NumericType numericType = NumericType.fromDexType(invoke.getReturnType());
+ Add add = new Add(numericType, invoke.outValue(), values.get(0), values.get(1));
+ iterator.replaceCurrentInstruction(add);
+ }
+
+ private NumericOperations() {
+ }
+}