Remove sorting of dynamic and direct targeted methods.
Bug: 132593519
Change-Id: I9c27cd076d0732ee44a4a3321450abd950c9e230
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java b/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java
index d6f0c77..9a5c390 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java
@@ -16,7 +16,7 @@
return appView.appInfo().isPinned(method.method)
|| appView.appInfo().isBootstrapMethod(method.method)
|| appView.appInfo().failedResolutionTargets.contains(method.method)
- || appView.appInfo().methodsTargetedByInvokeDynamic.contains(method.method)
+ || appView.appInfo().isMethodTargetedByInvokeDynamic(method.method)
|| method.accessFlags.isNative();
}
}
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 305bf9d..bed6243 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -110,9 +110,9 @@
private final Set<DexMethod> bootstrapMethods;
/** Set of methods that are the immediate target of an invoke-dynamic. */
- public final SortedSet<DexMethod> methodsTargetedByInvokeDynamic;
+ private final Set<DexMethod> methodsTargetedByInvokeDynamic;
/** Set of virtual methods that are the immediate target of an invoke-direct. */
- final SortedSet<DexMethod> virtualMethodsTargetedByInvokeDirect;
+ private final Set<DexMethod> virtualMethodsTargetedByInvokeDirect;
/**
* Set of methods that belong to live classes and can be reached by invokes. These need to be
* kept.
@@ -209,8 +209,8 @@
Set<DexMethod> targetedMethods,
Set<DexMethod> failedResolutionTargets,
Set<DexMethod> bootstrapMethods,
- SortedSet<DexMethod> methodsTargetedByInvokeDynamic,
- SortedSet<DexMethod> virtualMethodsTargetedByInvokeDirect,
+ Set<DexMethod> methodsTargetedByInvokeDynamic,
+ Set<DexMethod> virtualMethodsTargetedByInvokeDirect,
SortedSet<DexMethod> liveMethods,
FieldAccessInfoCollectionImpl fieldAccessInfoCollection,
MethodAccessInfoCollection methodAccessInfoCollection,
@@ -292,7 +292,7 @@
Set<DexMethod> targetedMethods,
Set<DexMethod> failedResolutionTargets,
Set<DexMethod> bootstrapMethods,
- SortedSet<DexMethod> methodsTargetedByInvokeDynamic,
+ Set<DexMethod> methodsTargetedByInvokeDynamic,
SortedSet<DexMethod> virtualMethodsTargetedByInvokeDirect,
SortedSet<DexMethod> liveMethods,
FieldAccessInfoCollectionImpl fieldAccessInfoCollection,
@@ -635,6 +635,14 @@
return bootstrapMethods.contains(method);
}
+ public boolean isMethodTargetedByInvokeDynamic(DexMethod method) {
+ return methodsTargetedByInvokeDynamic.contains(method);
+ }
+
+ public Set<DexMethod> getVirtualMethodsTargetedByInvokeDirect() {
+ return virtualMethodsTargetedByInvokeDirect;
+ }
+
public Collection<DexClass> computeReachableInterfaces() {
Set<DexClass> interfaces = Sets.newIdentityHashSet();
WorkList<DexType> worklist = WorkList.newIdentityWorkList();
@@ -1031,8 +1039,8 @@
lens.rewriteMethods(targetedMethods),
lens.rewriteMethodsSorted(failedResolutionTargets),
lens.rewriteMethods(bootstrapMethods),
- lens.rewriteMethodsSorted(methodsTargetedByInvokeDynamic),
- lens.rewriteMethodsSorted(virtualMethodsTargetedByInvokeDirect),
+ lens.rewriteMethods(methodsTargetedByInvokeDynamic),
+ lens.rewriteMethods(virtualMethodsTargetedByInvokeDirect),
lens.rewriteMethodsSorted(liveMethods),
fieldAccessInfoCollection.rewrittenWithLens(definitionSupplier, lens),
methodAccessInfoCollection.rewrittenWithLens(definitionSupplier, lens),
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 6b644bb..87ef664 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3177,9 +3177,8 @@
Enqueuer.toDescriptorSet(targetedMethods.getItems()),
Collections.unmodifiableSet(failedResolutionTargets),
Collections.unmodifiableSet(bootstrapMethods),
- ImmutableSortedSet.copyOf(DexMethod::slowCompareTo, methodsTargetedByInvokeDynamic),
- ImmutableSortedSet.copyOf(
- DexMethod::slowCompareTo, virtualMethodsTargetedByInvokeDirect),
+ Collections.unmodifiableSet(methodsTargetedByInvokeDynamic),
+ Collections.unmodifiableSet(virtualMethodsTargetedByInvokeDirect),
toSortedDescriptorSet(liveMethods.getItems()),
// Filter out library fields and pinned fields, because these are read by default.
fieldAccessInfoCollection,
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 9831468..b199de0 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -292,7 +292,7 @@
// another default method in the same interface (see InterfaceMethodDesugaringTests.testInvoke-
// SpecialToDefaultMethod). However, in a class, that would lead to a verification error.
// Therefore, we disallow merging such interfaces into their subtypes.
- for (DexMethod signature : appInfo.virtualMethodsTargetedByInvokeDirect) {
+ for (DexMethod signature : appInfo.getVirtualMethodsTargetedByInvokeDirect()) {
markTypeAsPinned(signature.holder, AbortReason.UNHANDLED_INVOKE_DIRECT);
}