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