Don't create multiple maps in ConcurrentMethodFixup
Bug: b/279707790
Change-Id: I9f769244fad0f566d2d6da6a27e464c70dbf9e44
diff --git a/src/main/java/com/android/tools/r8/graph/fixup/ConcurrentMethodFixup.java b/src/main/java/com/android/tools/r8/graph/fixup/ConcurrentMethodFixup.java
index 476361d..8a4c7bd 100644
--- a/src/main/java/com/android/tools/r8/graph/fixup/ConcurrentMethodFixup.java
+++ b/src/main/java/com/android/tools/r8/graph/fixup/ConcurrentMethodFixup.java
@@ -19,17 +19,14 @@
import com.android.tools.r8.optimize.argumentpropagation.utils.ProgramClassesBidirectedGraph;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.KeepMethodInfo;
-import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.Timing;
import com.android.tools.r8.utils.collections.DexMethodSignatureSet;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
-import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Comparator;
-import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -95,39 +92,30 @@
// 3) Map all classes top-down propagating the inherited signatures.
// The componentSignatures are already fully computed and should not be updated anymore.
- BiMap<DexMethodSignature, DexMethodSignature> immutableComponentSignaturesForTesting =
- InternalOptions.assertionsEnabled()
- ? ImmutableBiMap.copyOf(componentSignatures)
- : componentSignatures;
- Map<DexProgramClass, BiMap<DexMethodSignature, DexMethodSignature>> processedClasses =
- new IdentityHashMap<>();
+ // TODO(b/279707790): Consider changing the processing to have a different componentSignatures
+ // per subtree.
+ Set<DexProgramClass> processedClasses = Sets.newIdentityHashSet();
for (DexProgramClass clazz : sorted) {
if (!clazz.isInterface()) {
- processClass(clazz, processedClasses, immutableComponentSignaturesForTesting);
+ processClass(clazz, processedClasses, componentSignatures);
}
}
}
private void processClass(
DexProgramClass clazz,
- Map<DexProgramClass, BiMap<DexMethodSignature, DexMethodSignature>> processedClasses,
+ Set<DexProgramClass> processedClasses,
BiMap<DexMethodSignature, DexMethodSignature> componentSignatures) {
assert !clazz.isInterface();
- if (processedClasses.containsKey(clazz)) {
+ if (!processedClasses.add(clazz)) {
return;
}
// We need to process first the super-type for the top-down propagation of inherited signatures.
- DexClass superClass = appView.definitionFor(clazz.superType);
- BiMap<DexMethodSignature, DexMethodSignature> inheritedSignatures;
- if (superClass == null || !superClass.isProgramClass()) {
- inheritedSignatures = HashBiMap.create(componentSignatures);
- } else {
- DexProgramClass superProgramClass = superClass.asProgramClass();
- processClass(superProgramClass, processedClasses, componentSignatures);
- inheritedSignatures = HashBiMap.create(processedClasses.get(superProgramClass));
+ DexProgramClass superClass = asProgramClassOrNull(appView.definitionFor(clazz.superType));
+ if (superClass != null) {
+ processClass(superClass, processedClasses, componentSignatures);
}
- processedClasses.put(clazz, inheritedSignatures);
- MethodNamingUtility utility = createMethodNamingUtility(inheritedSignatures, clazz);
+ MethodNamingUtility utility = createMethodNamingUtility(componentSignatures, clazz);
programClassFixer.fixupProgramClass(clazz, utility);
}