Extend outliner test to inspect outline parameter types
Change-Id: I3e762e37628496bfd954798dbd13ca7a7a42a52b
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java
index bd357dd..99163fb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/exceptions/ThrowBlockOutlinerSharedStringBuilderTest.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.TestCompileResult;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
import com.android.tools.r8.utils.BooleanBox;
@@ -22,6 +23,7 @@
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.sun.tools.javac.util.List;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -52,7 +54,7 @@
options.getThrowBlockOutlinerOptions().enable = true;
options.getThrowBlockOutlinerOptions().outlineConsumerForTesting =
outlines -> {
- inspectOutlines(outlines);
+ inspectOutlines(outlines, options.dexItemFactory());
receivedCallback.set();
};
options.getThrowBlockOutlinerOptions().outlineStrategyForTesting =
@@ -73,12 +75,13 @@
.assertFailureWithErrorThatMatches(containsString("j=0, i=1"));
}
- private void inspectOutlines(Collection<ThrowBlockOutline> outlines) {
+ private void inspectOutlines(Collection<ThrowBlockOutline> outlines, DexItemFactory factory) {
// Verify that we have a single outline with two users.
assertEquals(1, outlines.size());
ThrowBlockOutline outline = outlines.iterator().next();
assertEquals(2, outline.getNumberOfUsers());
assertEquals(5, outline.getProto().getArity());
+ assertEquals(4, outline.getOptimizedProto(factory).getArity());
// Verify that the last argument is known to be constant.
AbstractValue lastArgument = ListUtils.last(outline.getArguments());
@@ -103,6 +106,18 @@
.anyMatch(i -> i.isNewInstance("java.lang.StringBuilder")));
assertTrue(outlineMethodSubject.streamInstructions().anyMatch(i -> i.isConstString(", k=42")));
+ // Validate that type weakening from java.lang.String to java.lang.Object works.
+ // The first parameter is java.lang.String since it is passed to StringBuilder.<init>(String).
+ // The third argument has been weakened from java.lang.String to java.lang.Object due to
+ // changing append(String) to append(Object).
+ assertEquals(
+ List.of(
+ inspector.getTypeSubject(String.class),
+ inspector.getTypeSubject(int.class),
+ inspector.getTypeSubject(Object.class),
+ inspector.getTypeSubject(int.class)),
+ outlineMethodSubject.getParameters());
+
// Validate that main() no longer uses StringBuilder and that it calls the outline twice.
MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
assertThat(mainMethodSubject, isPresent());
diff --git a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 9f24677..74cb241 100644
--- a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -233,6 +233,10 @@
return dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptorIgnorePrimitives(string));
}
+ public TypeSubject getTypeSubject(Class<?> clazz) {
+ return getTypeSubject(clazz.getTypeName());
+ }
+
public TypeSubject getTypeSubject(String string) {
return new TypeSubject(
this, dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptor(string)));