Handle collision in instance initializer merger
Bug: b/335209102
Change-Id: If66589ea6906f2ef5f03b5b61132bdb3f20cc5ae
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
index 5b9e401..362a9e0 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.horizontalclassmerging.InstanceInitializerMerger.Builder;
+import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import it.unimi.dsi.fastutil.objects.Reference2IntMap;
import java.util.ArrayList;
@@ -25,12 +26,12 @@
public class InstanceInitializerMergerCollection {
private final List<InstanceInitializerMerger> instanceInitializerMergers;
- private final Map<InstanceInitializerDescription, InstanceInitializerMerger>
+ private final Map<InstanceInitializerDescription, List<InstanceInitializerMerger>>
equivalentInstanceInitializerMergers;
private InstanceInitializerMergerCollection(
List<InstanceInitializerMerger> instanceInitializerMergers,
- Map<InstanceInitializerDescription, InstanceInitializerMerger>
+ Map<InstanceInitializerDescription, List<InstanceInitializerMerger>>
equivalentInstanceInitializerMergers) {
this.instanceInitializerMergers = instanceInitializerMergers;
this.equivalentInstanceInitializerMergers = equivalentInstanceInitializerMergers;
@@ -75,7 +76,7 @@
}
}));
- Map<InstanceInitializerDescription, InstanceInitializerMerger>
+ Map<InstanceInitializerDescription, List<InstanceInitializerMerger>>
equivalentInstanceInitializerMergers = new LinkedHashMap<>();
buildersByDescription.forEach(
(description, builder) -> {
@@ -88,7 +89,9 @@
buildersWithoutDescription.addAll(
instanceInitializerMerger.getInstanceInitializers());
} else {
- equivalentInstanceInitializerMergers.put(description, instanceInitializerMerger);
+ equivalentInstanceInitializerMergers
+ .computeIfAbsent(description, ignoreKey(ArrayList::new))
+ .add(instanceInitializerMerger);
}
}
});
@@ -127,7 +130,7 @@
public void forEach(Consumer<InstanceInitializerMerger> consumer) {
instanceInitializerMergers.forEach(consumer);
- equivalentInstanceInitializerMergers.values().forEach(consumer);
+ IterableUtils.flatten(equivalentInstanceInitializerMergers.values()).forEach(consumer);
}
public void setObsolete() {