Account for IINC instruction when collecting arg uses in jar code.
Bug: 131140696, 131207184, 131443760, 130789358
Change-Id: I8fba2eb7dc2b814b2f21f2ba4fc634bf7bb58dd1
diff --git a/src/main/java/com/android/tools/r8/jar/JarArgumentUseVisitor.java b/src/main/java/com/android/tools/r8/jar/JarArgumentUseVisitor.java
index 429c1eb..b46df5f 100644
--- a/src/main/java/com/android/tools/r8/jar/JarArgumentUseVisitor.java
+++ b/src/main/java/com/android/tools/r8/jar/JarArgumentUseVisitor.java
@@ -59,6 +59,13 @@
}
@Override
+ public void visitIincInsn(final int var, final int increment) {
+ if (var < arguments) {
+ registry.register(slotToArgument == null ? var : slotToArgument.get(var));
+ }
+ }
+
+ @Override
public void visitVarInsn(final int opcode, final int var) {
switch (opcode) {
case ILOAD:
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
index 62a5677..06f665d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
@@ -8,7 +8,9 @@
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.google.common.collect.ImmutableSet;
import java.util.Collection;
+import java.util.Set;
import org.junit.Assert;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -16,6 +18,7 @@
@RunWith(Parameterized.class)
public class UnusedArgumentsIntTest extends UnusedArgumentsTestBase {
+ private static final Set<String> methodsThatWontBeOptimized = ImmutableSet.of("main", "iinc");
public UnusedArgumentsIntTest(boolean minification) {
super(minification);
@@ -39,6 +42,12 @@
}
@NeverInline
+ public static int iinc(int a, int b) {
+ b++;
+ return a;
+ }
+
+ @NeverInline
public static int a(int a, int b, int c) {
return a;
}
@@ -47,6 +56,7 @@
System.out.print(a(1));
System.out.print(a(2, 3));
System.out.print(a(4, 5, 6));
+ System.out.print(iinc(8, 3));
}
}
@@ -57,16 +67,16 @@
@Override
public String getExpectedResult() {
- return "124";
+ return "1248";
}
@Override
public void inspectTestClass(ClassSubject clazz) {
- assertEquals(4, clazz.allMethods().size());
+ assertEquals(5, clazz.allMethods().size());
clazz.forAllMethods(
method -> {
Assert.assertTrue(
- method.getFinalName().equals("main")
+ methodsThatWontBeOptimized.contains(method.getOriginalName())
|| (method.getFinalSignature().parameters.length == 1
&& method.getFinalSignature().parameters[0].equals("int")));
});
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java
index 9275102..6c72d10 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsTestBase.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.ir.optimize.unusedarguments;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.junit.Assert.assertThat;
+import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.utils.codeinspector.ClassSubject;