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) {