Remove sorting of targeted methods in liveness info.
Bug: 132593519
Change-Id: Ic958cabb812c581245d96324e5f5b5e5eec9d9a8
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
index c788a1a..87cea9c 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -536,7 +536,15 @@
return result;
}
- public ImmutableSortedSet<DexMethod> rewriteMethods(Set<DexMethod> methods) {
+ public ImmutableSet<DexMethod> rewriteMethods(Set<DexMethod> methods) {
+ ImmutableSet.Builder<DexMethod> builder = ImmutableSet.builder();
+ for (DexMethod method : methods) {
+ builder.add(getRenamedMethodSignature(method));
+ }
+ return builder.build();
+ }
+
+ public ImmutableSortedSet<DexMethod> rewriteMethodsSorted(Set<DexMethod> methods) {
ImmutableSortedSet.Builder<DexMethod> builder =
new ImmutableSortedSet.Builder<>(PresortedComparable::slowCompare);
for (DexMethod method : methods) {
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 6922939..88665e0 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -99,7 +99,7 @@
* contained in {@link #liveMethods}, it may be marked as abstract and its implementation may be
* removed.
*/
- final SortedSet<DexMethod> targetedMethods;
+ private final Set<DexMethod> targetedMethods;
/** Set of targets that lead to resolution errors, such as non-existing or invalid targets. */
public final Set<DexMethod> failedResolutionTargets;
@@ -205,7 +205,7 @@
Set<DexType> missingTypes,
Set<DexType> liveTypes,
Set<DexType> instantiatedAppServices,
- SortedSet<DexMethod> targetedMethods,
+ Set<DexMethod> targetedMethods,
Set<DexMethod> failedResolutionTargets,
SortedSet<DexMethod> bootstrapMethods,
SortedSet<DexMethod> methodsTargetedByInvokeDynamic,
@@ -288,7 +288,7 @@
Set<DexType> missingTypes,
Set<DexType> liveTypes,
Set<DexType> instantiatedAppServices,
- SortedSet<DexMethod> targetedMethods,
+ Set<DexMethod> targetedMethods,
Set<DexMethod> failedResolutionTargets,
SortedSet<DexMethod> bootstrapMethods,
SortedSet<DexMethod> methodsTargetedByInvokeDynamic,
@@ -626,6 +626,10 @@
return clazz == null || !clazz.isProgramClass();
}
+ public boolean isTargetedMethod(DexMethod method) {
+ return targetedMethods.contains(method);
+ }
+
public Collection<DexClass> computeReachableInterfaces() {
Set<DexClass> interfaces = Sets.newIdentityHashSet();
WorkList<DexType> worklist = WorkList.newIdentityWorkList();
@@ -1020,11 +1024,11 @@
lens.rewriteTypes(liveTypes),
lens.rewriteTypes(instantiatedAppServices),
lens.rewriteMethods(targetedMethods),
- lens.rewriteMethods(failedResolutionTargets),
- lens.rewriteMethods(bootstrapMethods),
- lens.rewriteMethods(methodsTargetedByInvokeDynamic),
- lens.rewriteMethods(virtualMethodsTargetedByInvokeDirect),
- lens.rewriteMethods(liveMethods),
+ lens.rewriteMethodsSorted(failedResolutionTargets),
+ lens.rewriteMethodsSorted(bootstrapMethods),
+ lens.rewriteMethodsSorted(methodsTargetedByInvokeDynamic),
+ lens.rewriteMethodsSorted(virtualMethodsTargetedByInvokeDirect),
+ lens.rewriteMethodsSorted(liveMethods),
fieldAccessInfoCollection.rewrittenWithLens(definitionSupplier, lens),
methodAccessInfoCollection.rewrittenWithLens(definitionSupplier, lens),
objectAllocationInfoCollection.rewrittenWithLens(definitionSupplier, lens),
@@ -1033,14 +1037,14 @@
lens.rewriteReferenceKeys(mayHaveSideEffects),
lens.rewriteReferenceKeys(noSideEffects),
lens.rewriteReferenceKeys(assumedValues),
- lens.rewriteMethods(alwaysInline),
- lens.rewriteMethods(forceInline),
- lens.rewriteMethods(neverInline),
- lens.rewriteMethods(whyAreYouNotInlining),
- lens.rewriteMethods(keepConstantArguments),
- lens.rewriteMethods(keepUnusedArguments),
- lens.rewriteMethods(reprocess),
- lens.rewriteMethods(neverReprocess),
+ lens.rewriteMethodsSorted(alwaysInline),
+ lens.rewriteMethodsSorted(forceInline),
+ lens.rewriteMethodsSorted(neverInline),
+ lens.rewriteMethodsSorted(whyAreYouNotInlining),
+ lens.rewriteMethodsSorted(keepConstantArguments),
+ lens.rewriteMethodsSorted(keepUnusedArguments),
+ lens.rewriteMethodsSorted(reprocess),
+ lens.rewriteMethodsSorted(neverReprocess),
alwaysClassInline.rewriteItems(lens::lookupType),
lens.rewriteTypes(neverClassInline),
lens.rewriteTypes(noUnusedInterfaceRemoval),
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 4e342be..7624a67 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3174,7 +3174,7 @@
: missingTypes,
SetUtils.mapIdentityHashSet(liveTypes.getItems(), DexProgramClass::getType),
Collections.unmodifiableSet(instantiatedAppServices),
- Enqueuer.toSortedDescriptorSet(targetedMethods.getItems()),
+ Enqueuer.toDescriptorSet(targetedMethods.getItems()),
Collections.unmodifiableSet(failedResolutionTargets),
ImmutableSortedSet.copyOf(DexMethod::slowCompareTo, bootstrapMethods),
ImmutableSortedSet.copyOf(DexMethod::slowCompareTo, methodsTargetedByInvokeDynamic),
@@ -3358,6 +3358,15 @@
return builder.build();
}
+ private static <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
+ Set<R> toDescriptorSet(Set<D> set) {
+ ImmutableSet.Builder<R> builder = new ImmutableSet.Builder<>();
+ for (D item : set) {
+ builder.add(item.getReference());
+ }
+ return builder.build();
+ }
+
private static Object2BooleanMap<DexReference> joinIdentifierNameStrings(
Set<DexReference> explicit, Set<DexReference> implicit) {
Object2BooleanMap<DexReference> result = new Object2BooleanArrayMap<>();
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 5199435..8b623e3 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -1970,7 +1970,7 @@
public boolean verifyKeptMethodsAreTargetedAndLive(AppInfoWithLiveness appInfo) {
noShrinking.forEachMethod(
reference -> {
- assert appInfo.targetedMethods.contains(reference)
+ assert appInfo.isTargetedMethod(reference)
: "Expected kept method `" + reference.toSourceString() + "` to be targeted";
DexEncodedMethod method =
appInfo.definitionForHolder(reference).lookupMethod(reference);
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index caade38..67680af 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -299,7 +299,7 @@
? method
: method.toMethodThatLogsError(appView));
methodsToKeepForConfigurationDebugging.add(method.method);
- } else if (appInfo.targetedMethods.contains(method.getReference())) {
+ } else if (appInfo.isTargetedMethod(method.getReference())) {
// If the method is already abstract, and doesn't have code, let it be.
if (method.shouldNotHaveCode() && !method.hasCode()) {
reachableMethods.add(method);