Revert "Return a single dispatch target for final methods"

This reverts commit 18ef63b31a9beee0f43e55b5d967fde3b156a1c3.

Reason for revert: b/308793875

Change-Id: Ie979ec11db9bc443ccd81ee71e530b0ac189ac05
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index b7f9c4f..56c1ea4 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -1361,8 +1361,8 @@
         .isDefinitelyInstanceOfStaticType(appView, () -> dynamicReceiverType, staticReceiverType)) {
       return null;
     }
-    DexClass initialResolutionHolder = resolutionResult.getInitialResolutionHolder();
-    if (initialResolutionHolder.isInterface() != isInterface) {
+    DexClass initialResolutionHolder = definitionFor(method.holder);
+    if (initialResolutionHolder == null || initialResolutionHolder.isInterface() != isInterface) {
       return null;
     }
     DexType refinedReceiverType =
@@ -1372,24 +1372,27 @@
       // The refined receiver is not defined in the program and we cannot determine the target.
       return null;
     }
-    if (singleTargetLookupCache.hasPositiveCacheHit(refinedReceiverType, method)) {
-      return singleTargetLookupCache.getPositiveCacheHit(refinedReceiverType, method);
-    }
-    if (!dynamicReceiverType.hasDynamicLowerBoundType()
-        && singleTargetLookupCache.hasNegativeCacheHit(refinedReceiverType, method)) {
-      return null;
+    if (!dynamicReceiverType.hasDynamicLowerBoundType()) {
+      if (singleTargetLookupCache.hasPositiveCacheHit(refinedReceiverType, method)) {
+        return singleTargetLookupCache.getPositiveCacheHit(refinedReceiverType, method);
+      }
+      if (singleTargetLookupCache.hasNegativeCacheHit(refinedReceiverType, method)) {
+        return null;
+      }
     }
     if (resolutionResult
         .isAccessibleForVirtualDispatchFrom(context.getHolder(), appView)
         .isFalse()) {
       return null;
     }
-    // If the resolved method is final, return the resolution.
+    // If the method is modeled, return the resolution.
     DexClassAndMethod resolvedMethod = resolutionResult.getResolutionPair();
-    if (resolvedMethod.getHolder().isFinal() || resolvedMethod.getAccessFlags().isFinal()) {
-      if (!resolvedMethod.isLibraryMethod()
-          || modeledPredicate.isModeled(resolvedMethod.getHolderType())) {
-        return singleTargetLookupCache.addToCache(refinedReceiverType, method, resolvedMethod);
+    if (modeledPredicate.isModeled(resolutionResult.getResolvedHolder().getType())) {
+      if (resolutionResult.getResolvedHolder().isFinal()
+          || (resolvedMethod.getAccessFlags().isFinal()
+              && resolvedMethod.getAccessFlags().isPublic())) {
+        singleTargetLookupCache.addToCache(refinedReceiverType, method, resolvedMethod);
+        return resolvedMethod;
       }
     }
     DispatchTargetLookupResult exactTarget =
diff --git a/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java b/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java
index fbe53c8..0c576e0 100644
--- a/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java
+++ b/src/main/java/com/android/tools/r8/shaking/SingleTargetLookupCache.java
@@ -31,11 +31,10 @@
         .add(method);
   }
 
-  public DexClassAndMethod addToCache(
-      DexType refinedReceiverType, DexMethod method, DexClassAndMethod target) {
+  public void addToCache(DexType refinedReceiverType, DexMethod method, DexClassAndMethod target) {
     if (target == null) {
       addNoSingleTargetToCache(refinedReceiverType, method);
-      return null;
+      return;
     }
     assert !ObjectUtils.identical(target.getDefinition(), DexEncodedMethod.SENTINEL);
     assert !hasNegativeCacheHit(refinedReceiverType, method);
@@ -44,7 +43,6 @@
     positiveCache
         .computeIfAbsent(refinedReceiverType, ignoreKey(ConcurrentHashMap::new))
         .put(method, target);
-    return target;
   }
 
   public void removeInstantiatedType(DexType instantiatedType, AppInfoWithLiveness appInfo) {