Limit method resolution in bottom-up propagation of assume rules.
Bug: 137038659
Change-Id: I6ef425302fb6120fcc2c0841b48f8eeec897c9f1
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index b7e70add..3ae95b1 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -306,12 +306,13 @@
return;
}
for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
- propagateAssumeRules(encodedMethod.method, subTypes, noSideEffects);
- propagateAssumeRules(encodedMethod.method, subTypes, assumedValues);
+ propagateAssumeRules(clazz.type, encodedMethod.method, subTypes, noSideEffects);
+ propagateAssumeRules(clazz.type, encodedMethod.method, subTypes, assumedValues);
}
}
private void propagateAssumeRules(
+ DexType type,
DexMethod reference,
Set<DexType> subTypes,
Map<DexReference, ProguardMemberRule> assumeRulePool) {
@@ -325,7 +326,8 @@
// we apply those assume rules, here we use a resolved target.
DexEncodedMethod target =
appView.appInfo().resolveMethod(subType, referenceInSubType).asResultOfResolve();
- if (target == null) {
+ // But, the resolution should not be landed on the current type we are visiting.
+ if (target == null || target.method.holder == type) {
continue;
}
ProguardMemberRule ruleInSubType = assumeRulePool.get(target.method);
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java
index 58024e2..6806661 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.NeverMerge;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.errors.Unreachable;
@@ -92,6 +93,7 @@
public void testR8() throws Exception {
testForR8(parameters.getBackend())
.addInnerClasses(AssumenosideeffectsWithMultipleTargetsTest.class)
+ .enableMergeAnnotations()
.enableClassInliningAnnotations()
.enableInliningAnnotations()
.addKeepMainRule(MAIN)
@@ -107,6 +109,10 @@
void info(String tag, String message);
}
+ @NeverMerge
+ static abstract class AbstractLogger implements TestLogger {
+ }
+
@NeverClassInline
static class TestLoggerImplementer implements TestLogger {
@@ -118,7 +124,7 @@
}
@NeverClassInline
- static class AnotherImplementer implements TestLogger {
+ static class AnotherImplementer extends AbstractLogger implements TestLogger {
@NeverInline
@Override