Fix issue in monomorphic method analysis
Bug: b/336791970
Change-Id: Ic01c05b54ad1746f72cd34662d649dbaf5151697
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysisBase.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysisBase.java
index 4f8fde7..0165f8e 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysisBase.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/VirtualRootMethodsAnalysisBase.java
@@ -219,17 +219,19 @@
&& !virtualRootMethod.hasSiblings()
&& !virtualRootMethod.isMayDispatchOutsideProgramSet()) {
monomorphicVirtualRootMethods.add(rootCandidate);
- } else {
+ return;
+ }
+ if (!rootCandidate.getHolder().isInterface()) {
VirtualRootMethod singleDispatchTarget = virtualRootMethod.getSingleDispatchTarget();
if (singleDispatchTarget != null) {
virtualRootMethod.forEach(
method -> setRootMethod(method, virtualRootMethod, singleDispatchTarget));
monomorphicVirtualNonRootMethods.add(singleDispatchTarget.getMethod());
- } else {
- virtualRootMethod.forEach(
- method -> setRootMethod(method, virtualRootMethod, virtualRootMethod));
+ return;
}
}
+ virtualRootMethod.forEach(
+ method -> setRootMethod(method, virtualRootMethod, virtualRootMethod));
});
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/PropagationFromBaseMethodWithSingleTargetTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/PropagationFromBaseMethodWithSingleTargetTest.java
index cfe8557..9a48d47 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/PropagationFromBaseMethodWithSingleTargetTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/PropagationFromBaseMethodWithSingleTargetTest.java
@@ -33,15 +33,6 @@
}
@Test
- public void testJvm() throws Exception {
- parameters.assumeJvmTestParameters();
- testForJvm(parameters)
- .addInnerClasses(getClass())
- .run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutputLines("B", "C");
- }
-
- @Test
public void testR8() throws Exception {
testForR8(parameters.getBackend())
.addInnerClasses(getClass())
@@ -54,8 +45,7 @@
.setMinApi(parameters)
.compile()
.run(parameters.getRuntime(), Main.class)
- // TODO(b/336791970): Should succeed.
- .assertFailureWithErrorThatThrows(NullPointerException.class);
+ .assertSuccessWithOutputLines("B", "C");
}
static class Main {