Move shared class merging classes to classmerging package
Change-Id: Ib4d2c73e1f326c66f443f3670d0b3b5fac8e810a
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/MergeGroupBase.java b/src/main/java/com/android/tools/r8/classmerging/MergeGroup.java
similarity index 72%
rename from src/main/java/com/android/tools/r8/horizontalclassmerging/MergeGroupBase.java
rename to src/main/java/com/android/tools/r8/classmerging/MergeGroup.java
index 8d96410..a811666 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/MergeGroupBase.java
+++ b/src/main/java/com/android/tools/r8/classmerging/MergeGroup.java
@@ -1,9 +1,9 @@
// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.horizontalclassmerging;
+package com.android.tools.r8.classmerging;
-public abstract class MergeGroupBase {
+public abstract class MergeGroup {
public abstract int size();
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java b/src/main/java/com/android/tools/r8/classmerging/Policy.java
similarity index 73%
rename from src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java
rename to src/main/java/com/android/tools/r8/classmerging/Policy.java
index 530a642..3eac536 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java
+++ b/src/main/java/com/android/tools/r8/classmerging/Policy.java
@@ -2,15 +2,19 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.horizontalclassmerging;
+package com.android.tools.r8.classmerging;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
+import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
+import com.android.tools.r8.horizontalclassmerging.MultiClassPolicyWithPreprocessing;
+import com.android.tools.r8.horizontalclassmerging.SingleClassPolicy;
import com.android.tools.r8.verticalclassmerging.VerticalClassMergerPolicy;
import java.util.ArrayList;
import java.util.Collection;
/**
- * The super class of all horizontal class merging policies. Most classes will either implement
- * {@link SingleClassPolicy} or {@link MultiClassPolicy}.
+ * The super class of all class merging policies. Most classes will either implement {@link
+ * SingleClassPolicy} or {@link MultiClassPolicy}.
*/
public abstract class Policy {
@@ -66,18 +70,19 @@
/**
* Remove all groups containing no or only a single class, as there is no point in merging these.
*/
- protected Collection<MergeGroup> removeTrivialGroups(Collection<MergeGroup> groups) {
+ protected Collection<HorizontalMergeGroup> removeTrivialGroups(
+ Collection<HorizontalMergeGroup> groups) {
assert !(groups instanceof ArrayList);
- groups.removeIf(MergeGroup::isTrivial);
+ groups.removeIf(HorizontalMergeGroup::isTrivial);
return groups;
}
- boolean recordRemovedClassesForDebugging(
- boolean isInterfaceGroup, int previousGroupSize, Collection<MergeGroup> newGroups) {
+ public boolean recordRemovedClassesForDebugging(
+ boolean isInterfaceGroup, int previousGroupSize, Collection<HorizontalMergeGroup> newGroups) {
assert previousGroupSize >= 2;
int previousNumberOfRemovedClasses = previousGroupSize - 1;
int newNumberOfRemovedClasses = 0;
- for (MergeGroup newGroup : newGroups) {
+ for (HorizontalMergeGroup newGroup : newGroups) {
if (newGroup.isNonTrivial()) {
newNumberOfRemovedClasses += newGroup.size() - 1;
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java b/src/main/java/com/android/tools/r8/classmerging/PolicyExecutor.java
similarity index 94%
rename from src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java
rename to src/main/java/com/android/tools/r8/classmerging/PolicyExecutor.java
index 0495ce2..fb199e0 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java
+++ b/src/main/java/com/android/tools/r8/classmerging/PolicyExecutor.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.horizontalclassmerging;
+package com.android.tools.r8.classmerging;
import com.android.tools.r8.utils.Timing;
import java.util.Collection;
@@ -15,7 +15,7 @@
* primarily be readable and correct. The SimplePolicyExecutor should be a reference implementation,
* against which more efficient policy executors can be compared.
*/
-public abstract class PolicyExecutor<MG extends MergeGroupBase> {
+public abstract class PolicyExecutor<MG extends MergeGroup> {
/**
* Given an initial collection of class groups which can potentially be merged, run all of the
diff --git a/src/main/java/com/android/tools/r8/classmerging/SyntheticArgumentClass.java b/src/main/java/com/android/tools/r8/classmerging/SyntheticArgumentClass.java
index a8dcd49..54cdd43 100644
--- a/src/main/java/com/android/tools/r8/classmerging/SyntheticArgumentClass.java
+++ b/src/main/java/com/android/tools/r8/classmerging/SyntheticArgumentClass.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import com.google.common.base.Suppliers;
@@ -60,7 +60,7 @@
.createFixedClass(syntheticKindSelector, context, appView, builder -> {});
}
- public SyntheticArgumentClass build(Collection<MergeGroup> mergeGroups) {
+ public SyntheticArgumentClass build(Collection<HorizontalMergeGroup> mergeGroups) {
return build(getDeterministicContext(mergeGroups));
}
@@ -87,9 +87,10 @@
return new SyntheticArgumentClass(syntheticArgumentTypes);
}
- private static DexProgramClass getDeterministicContext(Collection<MergeGroup> mergeGroups) {
+ private static DexProgramClass getDeterministicContext(
+ Collection<HorizontalMergeGroup> mergeGroups) {
// Relies on the determinism of the merge groups.
- MergeGroup mergeGroup = mergeGroups.iterator().next();
+ HorizontalMergeGroup mergeGroup = mergeGroups.iterator().next();
assert mergeGroup.hasTarget();
return mergeGroup.getTarget();
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
index 8edf836..778132e 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
@@ -33,7 +33,9 @@
DexEncodedField[] merge();
static ClassInstanceFieldsMerger create(
- AppView<?> appView, HorizontalClassMergerGraphLens.Builder lensBuilder, MergeGroup group) {
+ AppView<?> appView,
+ HorizontalClassMergerGraphLens.Builder lensBuilder,
+ HorizontalMergeGroup group) {
if (appView.hasClassHierarchy()) {
return new ClassInstanceFieldsMergerImpl(appView.withClassHierarchy(), lensBuilder, group);
} else {
@@ -137,7 +139,7 @@
class ClassInstanceFieldsMergerImpl implements ClassInstanceFieldsMerger {
private final AppView<? extends AppInfoWithClassHierarchy> appView;
- private final MergeGroup group;
+ private final HorizontalMergeGroup group;
@SuppressWarnings("BadImport")
private final Builder lensBuilder;
@@ -149,7 +151,7 @@
private ClassInstanceFieldsMergerImpl(
AppView<? extends AppInfoWithClassHierarchy> appView,
HorizontalClassMergerGraphLens.Builder lensBuilder,
- MergeGroup group) {
+ HorizontalMergeGroup group) {
this.appView = appView;
this.group = group;
this.lensBuilder = lensBuilder;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
index ecbf167..2097c3a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
@@ -60,7 +60,7 @@
private final AppView<?> appView;
private final Mode mode;
- private final MergeGroup group;
+ private final HorizontalMergeGroup group;
private final DexItemFactory dexItemFactory;
private final HorizontalClassMergerGraphLens.Builder lensBuilder;
@@ -81,7 +81,7 @@
IRCodeProvider codeProvider,
Mode mode,
HorizontalClassMergerGraphLens.Builder lensBuilder,
- MergeGroup group,
+ HorizontalMergeGroup group,
Collection<VirtualMethodMerger> virtualMethodMergers) {
this.appView = appView;
this.dexItemFactory = appView.dexItemFactory();
@@ -376,9 +376,10 @@
private final AppView<?> appView;
private final IRCodeProvider codeProvider;
private final Mode mode;
- private final MergeGroup group;
+ private final HorizontalMergeGroup group;
- public Builder(AppView<?> appView, IRCodeProvider codeProvider, MergeGroup group, Mode mode) {
+ public Builder(
+ AppView<?> appView, IRCodeProvider codeProvider, HorizontalMergeGroup group, Mode mode) {
this.appView = appView;
this.codeProvider = codeProvider;
this.group = group;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
index 81ec45e..dd6ddf2 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
@@ -17,7 +17,7 @@
private final AppView<?> appView;
private final DexItemFactory dexItemFactory;
- private final MergeGroup group;
+ private final HorizontalMergeGroup group;
@SuppressWarnings("BadImport")
private final Builder lensBuilder;
@@ -25,7 +25,9 @@
private final Map<DexField, DexEncodedField> targetFields = new LinkedHashMap<>();
public ClassStaticFieldsMerger(
- AppView<?> appView, HorizontalClassMergerGraphLens.Builder lensBuilder, MergeGroup group) {
+ AppView<?> appView,
+ HorizontalClassMergerGraphLens.Builder lensBuilder,
+ HorizontalMergeGroup group) {
this.appView = appView;
this.dexItemFactory = appView.dexItemFactory();
this.group = group;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
index 3bc0655..d7c99ba 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.graph.DexClassAndMethod.asProgramMethodOrNull;
+import com.android.tools.r8.classmerging.Policy;
import com.android.tools.r8.classmerging.SyntheticArgumentClass;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -126,7 +127,7 @@
// Run the policies on all program classes to produce a final grouping.
List<Policy> policies =
PolicyScheduler.getPolicies(appView, codeProvider, mode, runtimeTypeCheckInfo);
- Collection<MergeGroup> groups =
+ Collection<HorizontalMergeGroup> groups =
new HorizontalClassMergerPolicyExecutor()
.run(getInitialGroups(), policies, executorService, timing);
@@ -187,7 +188,7 @@
if (mode.isInitial()) {
fieldAccessInfoCollectionModifier = createFieldAccessInfoCollectionModifier(groups);
} else {
- assert groups.stream().noneMatch(MergeGroup::hasClassIdField);
+ assert groups.stream().noneMatch(HorizontalMergeGroup::hasClassIdField);
}
// Set the new graph lens before finalizing any synthetic code.
@@ -272,11 +273,11 @@
}
private FieldAccessInfoCollectionModifier createFieldAccessInfoCollectionModifier(
- Collection<MergeGroup> groups) {
+ Collection<HorizontalMergeGroup> groups) {
assert mode.isInitial();
FieldAccessInfoCollectionModifier.Builder builder =
new FieldAccessInfoCollectionModifier.Builder();
- for (MergeGroup group : groups) {
+ for (HorizontalMergeGroup group : groups) {
if (group.hasClassIdField()) {
DexProgramClass target = group.getTarget();
target.forEachProgramInstanceInitializerMatching(
@@ -292,7 +293,7 @@
}
private void transformIncompleteCode(
- Collection<MergeGroup> groups,
+ Collection<HorizontalMergeGroup> groups,
HorizontalClassMergerGraphLens horizontalClassMergerGraphLens,
ExecutorService executorService)
throws ExecutionException {
@@ -322,7 +323,8 @@
}
private boolean verifyNoIncompleteCode(
- Collection<MergeGroup> groups, ExecutorService executorService) throws ExecutionException {
+ Collection<HorizontalMergeGroup> groups, ExecutorService executorService)
+ throws ExecutionException {
ThreadUtils.processItems(
groups,
group -> {
@@ -357,9 +359,9 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
- private List<MergeGroup> getInitialGroups() {
- MergeGroup initialClassGroup = new MergeGroup();
- MergeGroup initialInterfaceGroup = new MergeGroup();
+ private List<HorizontalMergeGroup> getInitialGroups() {
+ HorizontalMergeGroup initialClassGroup = new HorizontalMergeGroup();
+ HorizontalMergeGroup initialInterfaceGroup = new HorizontalMergeGroup();
for (DexProgramClass clazz : appView.appInfo().classesWithDeterministicOrder()) {
if (clazz.isInterface()) {
initialInterfaceGroup.add(clazz);
@@ -367,10 +369,10 @@
initialClassGroup.add(clazz);
}
}
- List<MergeGroup> initialGroups = new LinkedList<>();
+ List<HorizontalMergeGroup> initialGroups = new LinkedList<>();
initialGroups.add(initialClassGroup);
initialGroups.add(initialInterfaceGroup);
- initialGroups.removeIf(MergeGroup::isTrivial);
+ initialGroups.removeIf(HorizontalMergeGroup::isTrivial);
return initialGroups;
}
@@ -381,9 +383,9 @@
private List<ClassMerger> initializeClassMergers(
IRCodeProvider codeProvider,
HorizontalClassMergerGraphLens.Builder lensBuilder,
- Collection<MergeGroup> groups) {
+ Collection<HorizontalMergeGroup> groups) {
List<ClassMerger> classMergers = new ArrayList<>(groups.size());
- for (MergeGroup group : groups) {
+ for (HorizontalMergeGroup group : groups) {
assert group.isNonTrivial();
assert group.hasInstanceFieldMap();
assert group.hasTarget();
@@ -439,8 +441,8 @@
@SuppressWarnings("ReferenceEquality")
private static boolean verifyNoCyclesInInterfaceHierarchies(
- AppView<?> appView, Collection<MergeGroup> groups) {
- for (MergeGroup group : groups) {
+ AppView<?> appView, Collection<HorizontalMergeGroup> groups) {
+ for (HorizontalMergeGroup group : groups) {
if (group.isClassGroup()) {
continue;
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerPolicyExecutor.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerPolicyExecutor.java
index f207cbc..be9f787 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerPolicyExecutor.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerPolicyExecutor.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.horizontalclassmerging;
+import com.android.tools.r8.classmerging.Policy;
+import com.android.tools.r8.classmerging.PolicyExecutor;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import java.util.Iterator;
@@ -10,11 +12,11 @@
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
-public class HorizontalClassMergerPolicyExecutor extends PolicyExecutor<MergeGroup> {
+public class HorizontalClassMergerPolicyExecutor extends PolicyExecutor<HorizontalMergeGroup> {
@Override
- protected LinkedList<MergeGroup> apply(
- Policy policy, LinkedList<MergeGroup> linkedGroups, ExecutorService executorService)
+ protected LinkedList<HorizontalMergeGroup> apply(
+ Policy policy, LinkedList<HorizontalMergeGroup> linkedGroups, ExecutorService executorService)
throws ExecutionException {
if (policy.isSingleClassPolicy()) {
applySingleClassPolicy(policy.asSingleClassPolicy(), linkedGroups);
@@ -31,10 +33,10 @@
return linkedGroups;
}
- void applySingleClassPolicy(SingleClassPolicy policy, LinkedList<MergeGroup> groups) {
- Iterator<MergeGroup> i = groups.iterator();
+ void applySingleClassPolicy(SingleClassPolicy policy, LinkedList<HorizontalMergeGroup> groups) {
+ Iterator<HorizontalMergeGroup> i = groups.iterator();
while (i.hasNext()) {
- MergeGroup group = i.next();
+ HorizontalMergeGroup group = i.next();
boolean isInterfaceGroup = group.isInterfaceGroup();
int previousGroupSize = group.size();
group.removeIf(clazz -> !policy.canMerge(clazz));
@@ -48,15 +50,15 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
- private LinkedList<MergeGroup> applyMultiClassPolicy(
- MultiClassPolicy policy, LinkedList<MergeGroup> groups) {
+ private LinkedList<HorizontalMergeGroup> applyMultiClassPolicy(
+ MultiClassPolicy policy, LinkedList<HorizontalMergeGroup> groups) {
// For each group apply the multi class policy and add all the new groups together.
- LinkedList<MergeGroup> newGroups = new LinkedList<>();
+ LinkedList<HorizontalMergeGroup> newGroups = new LinkedList<>();
groups.forEach(
group -> {
boolean isInterfaceGroup = group.isInterfaceGroup();
int previousGroupSize = group.size();
- Collection<MergeGroup> policyGroups = policy.apply(group);
+ Collection<HorizontalMergeGroup> policyGroups = policy.apply(group);
policyGroups.forEach(newGroup -> newGroup.applyMetadataFrom(group));
assert policy.recordRemovedClassesForDebugging(
isInterfaceGroup, previousGroupSize, policyGroups);
@@ -67,19 +69,19 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
- private <T> LinkedList<MergeGroup> applyMultiClassPolicyWithPreprocessing(
+ private <T> LinkedList<HorizontalMergeGroup> applyMultiClassPolicyWithPreprocessing(
MultiClassPolicyWithPreprocessing<T> policy,
- LinkedList<MergeGroup> groups,
+ LinkedList<HorizontalMergeGroup> groups,
ExecutorService executorService)
throws ExecutionException {
// For each group apply the multi class policy and add all the new groups together.
T data = policy.preprocess(groups, executorService);
- LinkedList<MergeGroup> newGroups = new LinkedList<>();
+ LinkedList<HorizontalMergeGroup> newGroups = new LinkedList<>();
groups.forEach(
group -> {
boolean isInterfaceGroup = group.isInterfaceGroup();
int previousGroupSize = group.size();
- Collection<MergeGroup> policyGroups = policy.apply(group, data);
+ Collection<HorizontalMergeGroup> policyGroups = policy.apply(group, data);
policyGroups.forEach(newGroup -> newGroup.applyMetadataFrom(group));
assert policy.recordRemovedClassesForDebugging(
isInterfaceGroup, previousGroupSize, policyGroups);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/MergeGroup.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalMergeGroup.java
similarity index 94%
rename from src/main/java/com/android/tools/r8/horizontalclassmerging/MergeGroup.java
rename to src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalMergeGroup.java
index 06b3ab6..9210ef9 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/MergeGroup.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalMergeGroup.java
@@ -6,6 +6,7 @@
package com.android.tools.r8.horizontalclassmerging;
+import com.android.tools.r8.classmerging.MergeGroup;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
@@ -26,7 +27,7 @@
import java.util.function.Consumer;
import java.util.function.Predicate;
-public class MergeGroup extends MergeGroupBase implements Collection<DexProgramClass> {
+public class HorizontalMergeGroup extends MergeGroup implements Collection<DexProgramClass> {
public static class Metadata {}
@@ -42,21 +43,21 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
- public MergeGroup() {
+ public HorizontalMergeGroup() {
this.classes = new LinkedList<>();
}
- public MergeGroup(DexProgramClass clazz) {
+ public HorizontalMergeGroup(DexProgramClass clazz) {
this();
add(clazz);
}
- public MergeGroup(Iterable<DexProgramClass> classes) {
+ public HorizontalMergeGroup(Iterable<DexProgramClass> classes) {
this();
Iterables.addAll(this.classes, classes);
}
- public void applyMetadataFrom(MergeGroup group) {
+ public void applyMetadataFrom(HorizontalMergeGroup group) {
if (metadata == null) {
metadata = group.metadata;
}
@@ -67,7 +68,7 @@
return classes.add(clazz);
}
- public boolean add(MergeGroup group) {
+ public boolean add(HorizontalMergeGroup group) {
return classes.addAll(group.getClasses());
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java
index f832f3a..197f2b8 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontallyMergedClasses.java
@@ -112,11 +112,11 @@
mergedClasses.put(source, target);
}
- void addMergeGroup(MergeGroup group) {
+ void addMergeGroup(HorizontalMergeGroup group) {
group.forEachSource(clazz -> add(clazz.getType(), group.getTarget().getType()));
}
- Builder addMergeGroups(Iterable<MergeGroup> groups) {
+ Builder addMergeGroups(Iterable<HorizontalMergeGroup> groups) {
groups.forEach(this::addMergeGroup);
return this;
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java
index 67022ed..f49af82 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerAnalysis.java
@@ -40,7 +40,7 @@
public static InstanceInitializerDescription analyze(
AppView<? extends AppInfoWithClassHierarchy> appView,
IRCodeProvider codeProvider,
- MergeGroup group,
+ HorizontalMergeGroup group,
InstanceInitializer instanceInitializer) {
if (instanceInitializer.isAbsent()) {
InstanceInitializerDescription.Builder builder =
@@ -69,7 +69,7 @@
public static InstanceInitializerDescription analyze(
AppView<? extends AppInfoWithClassHierarchy> appView,
IRCodeProvider codeProvider,
- MergeGroup group,
+ HorizontalMergeGroup group,
ProgramMethod instanceInitializer) {
InstanceInitializerDescription.Builder builder =
InstanceInitializerDescription.builder(appView, instanceInitializer);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java
index 2360c36..dc5f15e 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerDescription.java
@@ -74,7 +74,7 @@
*/
public IncompleteMergedInstanceInitializerCode createCfCode(
DexMethod originalMethodReference,
- MergeGroup group,
+ HorizontalMergeGroup group,
boolean hasClassId,
int extraNulls) {
return new IncompleteMergedInstanceInitializerCode(
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
index 54f4898..b522877 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
@@ -45,7 +45,7 @@
private final AppView<? extends AppInfoWithClassHierarchy> appView;
private final Reference2IntMap<DexType> classIdentifiers;
private final DexItemFactory dexItemFactory;
- private final MergeGroup group;
+ private final HorizontalMergeGroup group;
private final List<ProgramMethod> instanceInitializers;
private final InstanceInitializerDescription instanceInitializerDescription;
private final HorizontalClassMergerGraphLens.Builder lensBuilder;
@@ -54,7 +54,7 @@
InstanceInitializerMerger(
AppView<? extends AppInfoWithClassHierarchy> appView,
Reference2IntMap<DexType> classIdentifiers,
- MergeGroup group,
+ HorizontalMergeGroup group,
List<ProgramMethod> instanceInitializers,
HorizontalClassMergerGraphLens.Builder lensBuilder,
Mode mode) {
@@ -64,7 +64,7 @@
InstanceInitializerMerger(
AppView<? extends AppInfoWithClassHierarchy> appView,
Reference2IntMap<DexType> classIdentifiers,
- MergeGroup group,
+ HorizontalMergeGroup group,
List<ProgramMethod> instanceInitializers,
HorizontalClassMergerGraphLens.Builder lensBuilder,
Mode mode,
@@ -214,7 +214,7 @@
return this;
}
- public List<InstanceInitializerMerger> build(MergeGroup group) {
+ public List<InstanceInitializerMerger> build(HorizontalMergeGroup group) {
assert instanceInitializerGroups.stream().noneMatch(List::isEmpty);
return ListUtils.map(
instanceInitializerGroups,
@@ -224,7 +224,7 @@
}
public InstanceInitializerMerger buildSingle(
- MergeGroup group, InstanceInitializerDescription instanceInitializerDescription) {
+ HorizontalMergeGroup group, InstanceInitializerDescription instanceInitializerDescription) {
assert instanceInitializerGroups.stream().noneMatch(List::isEmpty);
assert instanceInitializerGroups.size() == 1;
List<ProgramMethod> instanceInitializers = ListUtils.first(instanceInitializerGroups);
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 50a0f23..62d7522 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
@@ -42,7 +42,7 @@
AppView<?> appView,
Reference2IntMap<DexType> classIdentifiers,
IRCodeProvider codeProvider,
- MergeGroup group,
+ HorizontalMergeGroup group,
HorizontalClassMergerGraphLens.Builder lensBuilder,
Mode mode) {
if (!appView.hasClassHierarchy()) {
@@ -130,7 +130,7 @@
instanceInitializerMergers, equivalentInstanceInitializerMergers);
}
- private static boolean verifyNoInstanceInitializers(MergeGroup group) {
+ private static boolean verifyNoInstanceInitializers(HorizontalMergeGroup group) {
group.forEach(
clazz -> {
assert !clazz.programInstanceInitializers().iterator().hasNext();
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicy.java
index 63420fe..8bad6ec 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicy.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicy.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.horizontalclassmerging;
+import com.android.tools.r8.classmerging.Policy;
import java.util.Collection;
public abstract class MultiClassPolicy extends Policy {
@@ -16,7 +17,7 @@
* merged. If the policy detects no issues then `group` will be returned unchanged. If classes
* cannot be merged with any other classes they are returned as singleton lists.
*/
- public abstract Collection<MergeGroup> apply(MergeGroup group);
+ public abstract Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group);
@Override
public boolean isMultiClassPolicy() {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicyWithPreprocessing.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicyWithPreprocessing.java
index d634479..416164b 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicyWithPreprocessing.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassPolicyWithPreprocessing.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.horizontalclassmerging;
+import com.android.tools.r8.classmerging.Policy;
import java.util.Collection;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -19,9 +20,10 @@
* merged. If the policy detects no issues then `group` will be returned unchanged. If classes
* cannot be merged with any other classes they are returned as singleton lists.
*/
- public abstract Collection<MergeGroup> apply(MergeGroup group, T data);
+ public abstract Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group, T data);
- public abstract T preprocess(Collection<MergeGroup> groups, ExecutorService executorService)
+ public abstract T preprocess(
+ Collection<HorizontalMergeGroup> groups, ExecutorService executorService)
throws ExecutionException;
@Override
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassSameReferencePolicy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassSameReferencePolicy.java
index aa3ca62..40399c0 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassSameReferencePolicy.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/MultiClassSameReferencePolicy.java
@@ -12,12 +12,12 @@
public abstract class MultiClassSameReferencePolicy<T> extends MultiClassPolicy {
@Override
- public final Collection<MergeGroup> apply(MergeGroup group) {
- Map<T, MergeGroup> groups = new LinkedHashMap<>();
+ public final Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
+ Map<T, HorizontalMergeGroup> groups = new LinkedHashMap<>();
for (DexProgramClass clazz : group) {
T mergeKey = getMergeKey(clazz);
if (mergeKey != null) {
- groups.computeIfAbsent(mergeKey, ignore -> new MergeGroup()).add(clazz);
+ groups.computeIfAbsent(mergeKey, ignore -> new HorizontalMergeGroup()).add(clazz);
}
}
removeTrivialGroups(groups.values());
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
index da96bcf..fa18dbb 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.horizontalclassmerging;
+import com.android.tools.r8.classmerging.Policy;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/SingleClassPolicy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/SingleClassPolicy.java
index db2d8eb..7c9aedb 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/SingleClassPolicy.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/SingleClassPolicy.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.horizontalclassmerging;
+import com.android.tools.r8.classmerging.Policy;
import com.android.tools.r8.graph.DexProgramClass;
public abstract class SingleClassPolicy extends Policy {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
index 5b1ee78..6175c5a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
@@ -49,13 +49,13 @@
private final AppView<? extends AppInfoWithClassHierarchy> appView;
private final DexItemFactory dexItemFactory;
- private final MergeGroup group;
+ private final HorizontalMergeGroup group;
private final List<ProgramMethod> methods;
private final SuperMethodReference superMethod;
public VirtualMethodMerger(
AppView<? extends AppInfoWithClassHierarchy> appView,
- MergeGroup group,
+ HorizontalMergeGroup group,
List<ProgramMethod> methods,
SuperMethodReference superMethod) {
this.appView = appView;
@@ -75,7 +75,7 @@
/** Get the super method handle if this method overrides a parent method. */
private SuperMethodReference superMethod(
- AppView<? extends AppInfoWithClassHierarchy> appView, MergeGroup group) {
+ AppView<? extends AppInfoWithClassHierarchy> appView, HorizontalMergeGroup group) {
DexMethod template = methods.iterator().next().getReference();
SingleResolutionResult<?> resolutionResult =
appView
@@ -98,7 +98,7 @@
}
public VirtualMethodMerger build(
- AppView<? extends AppInfoWithClassHierarchy> appView, MergeGroup group) {
+ AppView<? extends AppInfoWithClassHierarchy> appView, HorizontalMergeGroup group) {
// If not all the classes are in the merge group, find the fallback super method to call.
SuperMethodReference superMethod =
methods.size() < group.size() ? superMethod(appView, group) : null;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
index a0b8b9b..19efa91 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
@@ -24,7 +24,7 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.IRMetadata;
@@ -59,7 +59,7 @@
this.classInitializers = classInitializers;
}
- public static ClassInitializerMerger create(MergeGroup group) {
+ public static ClassInitializerMerger create(HorizontalMergeGroup group) {
ClassInitializerMerger.Builder builder = new ClassInitializerMerger.Builder();
group.forEach(
clazz -> {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AtMostOneClassThatMatchesPolicy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AtMostOneClassThatMatchesPolicy.java
index 17bb034..82cc1b5 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AtMostOneClassThatMatchesPolicy.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AtMostOneClassThatMatchesPolicy.java
@@ -7,7 +7,7 @@
import static com.android.tools.r8.utils.IteratorUtils.createCircularIterator;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
@@ -20,12 +20,12 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
// Create a new merge group for each class that we want at most one of.
- List<MergeGroup> newGroups = new LinkedList<>();
+ List<HorizontalMergeGroup> newGroups = new LinkedList<>();
for (DexProgramClass clazz : group) {
if (atMostOneOf(clazz)) {
- newGroups.add(new MergeGroup(clazz));
+ newGroups.add(new HorizontalMergeGroup(clazz));
}
}
@@ -36,7 +36,7 @@
}
// Otherwise, fill up the new merge groups with the remaining classes.
- Iterator<MergeGroup> newGroupsIterator = createCircularIterator(newGroups);
+ Iterator<HorizontalMergeGroup> newGroupsIterator = createCircularIterator(newGroups);
for (DexProgramClass clazz : group) {
if (!atMostOneOf(clazz)) {
newGroupsIterator.next().add(clazz);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/FinalizeMergeGroup.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/FinalizeMergeGroup.java
index b9c4c3c..16e17f0 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/FinalizeMergeGroup.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/FinalizeMergeGroup.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.SetUtils;
@@ -34,7 +34,7 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
if (appView.enableWholeProgramOptimizations()) {
if (mode.isInitial() || group.isInterfaceGroup()) {
group.selectTarget(appView);
@@ -63,7 +63,7 @@
return true;
}
- private boolean verifyAlreadyFinalized(MergeGroup group) {
+ private boolean verifyAlreadyFinalized(HorizontalMergeGroup group) {
assert group.hasTarget();
assert group.getClasses().contains(group.getTarget());
assert group.hasInstanceFieldMap();
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitClassGroups.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitClassGroups.java
index d271464..728cf5e 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitClassGroups.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitClassGroups.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import java.util.Collection;
import java.util.Collections;
@@ -27,13 +27,13 @@
// TODO(b/270398965): Replace LinkedList.
@Override
@SuppressWarnings({"JdkObsolete", "MixedMutabilityReturnType"})
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
if (group.size() <= maxGroupSize || group.isInterfaceGroup()) {
return Collections.singletonList(group);
}
- LinkedList<MergeGroup> newGroups = new LinkedList<>();
- MergeGroup newGroup = createNewGroup(newGroups);
+ LinkedList<HorizontalMergeGroup> newGroups = new LinkedList<>();
+ HorizontalMergeGroup newGroup = createNewGroup(newGroups);
for (DexProgramClass clazz : group) {
if (newGroup.size() == maxGroupSize) {
newGroup = createNewGroup(newGroups);
@@ -42,7 +42,7 @@
}
if (newGroup.size() == 1) {
if (maxGroupSize == 2) {
- MergeGroup removedGroup = newGroups.removeLast();
+ HorizontalMergeGroup removedGroup = newGroups.removeLast();
assert removedGroup == newGroup;
} else {
newGroup.add(newGroups.getFirst().removeLast());
@@ -51,8 +51,8 @@
return newGroups;
}
- private MergeGroup createNewGroup(LinkedList<MergeGroup> newGroups) {
- MergeGroup newGroup = new MergeGroup();
+ private HorizontalMergeGroup createNewGroup(LinkedList<HorizontalMergeGroup> newGroups) {
+ HorizontalMergeGroup newGroup = new HorizontalMergeGroup();
newGroups.add(newGroup);
return newGroup;
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitInterfaceGroups.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitInterfaceGroups.java
index adee1f4..414003a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitInterfaceGroups.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitInterfaceGroups.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import java.util.Collection;
import java.util.Collections;
@@ -25,24 +25,24 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
if (group.isClassGroup()) {
return Collections.singletonList(group);
}
// Mapping from new merge groups to their size.
- Map<MergeGroup, Integer> newGroups = new LinkedHashMap<>();
+ Map<HorizontalMergeGroup, Integer> newGroups = new LinkedHashMap<>();
for (DexProgramClass clazz : group) {
processClass(clazz, newGroups);
}
return removeTrivialGroups(newGroups.keySet());
}
- private void processClass(DexProgramClass clazz, Map<MergeGroup, Integer> newGroups) {
+ private void processClass(DexProgramClass clazz, Map<HorizontalMergeGroup, Integer> newGroups) {
int increment = clazz.getMethodCollection().size();
// Find an existing group.
- for (Entry<MergeGroup, Integer> entry : newGroups.entrySet()) {
- MergeGroup candidateGroup = entry.getKey();
+ for (Entry<HorizontalMergeGroup, Integer> entry : newGroups.entrySet()) {
+ HorizontalMergeGroup candidateGroup = entry.getKey();
int candidateGroupSize = entry.getValue();
int newCandidateGroupSize = candidateGroupSize + increment;
if (newCandidateGroupSize <= maxGroupSize) {
@@ -53,7 +53,7 @@
}
// Failed to find an existing group.
- newGroups.put(new MergeGroup(clazz), increment);
+ newGroups.put(new HorizontalMergeGroup(clazz), increment);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeInstanceFieldCasts.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeInstanceFieldCasts.java
index 0242766..bfd431f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeInstanceFieldCasts.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeInstanceFieldCasts.java
@@ -7,7 +7,7 @@
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
@@ -20,13 +20,13 @@
public class MinimizeInstanceFieldCasts extends MultiClassPolicy {
@Override
- public final Collection<MergeGroup> apply(MergeGroup group) {
+ public final Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
// First find all classes that can be merged without changing field types.
- Map<Multiset<DexType>, MergeGroup> newGroups = new LinkedHashMap<>();
+ Map<Multiset<DexType>, HorizontalMergeGroup> newGroups = new LinkedHashMap<>();
group.forEach(clazz -> addExact(clazz, newGroups));
// Create a single group from all trivial groups.
- MergeGroup pendingGroup = new MergeGroup();
+ HorizontalMergeGroup pendingGroup = new HorizontalMergeGroup();
newGroups
.values()
.removeIf(
@@ -43,13 +43,14 @@
}
if (!pendingGroup.isTrivial()) {
- List<MergeGroup> newGroupsIncludingRelaxedGroup = new ArrayList<>(newGroups.values());
+ List<HorizontalMergeGroup> newGroupsIncludingRelaxedGroup =
+ new ArrayList<>(newGroups.values());
newGroupsIncludingRelaxedGroup.add(pendingGroup);
return newGroupsIncludingRelaxedGroup;
}
- MergeGroup smallestNewGroup = null;
- for (MergeGroup newGroup : newGroups.values()) {
+ HorizontalMergeGroup smallestNewGroup = null;
+ for (HorizontalMergeGroup newGroup : newGroups.values()) {
if (smallestNewGroup == null || newGroup.size() < smallestNewGroup.size()) {
smallestNewGroup = newGroup;
}
@@ -59,8 +60,11 @@
return newGroups.values();
}
- private void addExact(DexProgramClass clazz, Map<Multiset<DexType>, MergeGroup> groups) {
- groups.computeIfAbsent(getExactMergeKey(clazz), ignore -> new MergeGroup()).add(clazz);
+ private void addExact(
+ DexProgramClass clazz, Map<Multiset<DexType>, HorizontalMergeGroup> groups) {
+ groups
+ .computeIfAbsent(getExactMergeKey(clazz), ignore -> new HorizontalMergeGroup())
+ .add(clazz);
}
private Multiset<DexType> getExactMergeKey(DexProgramClass clazz) {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
index bb60289..9addf2f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
@@ -20,7 +20,7 @@
import com.android.tools.r8.graph.MethodResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.lens.GraphLens;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicyWithPreprocessing;
import com.android.tools.r8.horizontalclassmerging.policies.deadlock.SingleCallerInformation;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -97,7 +97,7 @@
final AppView<AppInfoWithLiveness> appView;
// Mapping from each merge candidate to its merge group.
- final Map<DexProgramClass, MergeGroup> allGroups = new IdentityHashMap<>();
+ final Map<DexProgramClass, HorizontalMergeGroup> allGroups = new IdentityHashMap<>();
private SingleCallerInformation singleCallerInformation;
@@ -112,24 +112,25 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
@Override
- public Collection<MergeGroup> apply(MergeGroup group, Void nothing) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group, Void nothing) {
// Partition the merge group into smaller groups that may be merged. If the class initialization
// of a parent class may initialize a member of the merge group, then this member is not
// eligible for class merging, unless the only way to class initialize this member is from the
// class initialization of the parent class. In this case, the member may be merged with other
// group members that are also guaranteed to only be class initialized from the class
// initialization of the parent class.
- List<MergeGroup> partitioning = partitionClassesWithPossibleClassInitializerDeadlock(group);
- List<MergeGroup> newGroups = new LinkedList<>();
+ List<HorizontalMergeGroup> partitioning =
+ partitionClassesWithPossibleClassInitializerDeadlock(group);
+ List<HorizontalMergeGroup> newGroups = new LinkedList<>();
// Revisit each partition. If the class initialization of a group member may initialize another
// class (not necessarily a group member), and vice versa, then class initialization could
// deadlock if the group member is merged with another class that is initialized concurrently.
- for (MergeGroup partition : partitioning) {
- List<MergeGroup> newGroupsFromPartition = new LinkedList<>();
+ for (HorizontalMergeGroup partition : partitioning) {
+ List<HorizontalMergeGroup> newGroupsFromPartition = new LinkedList<>();
Tracer tracer = new Tracer(partition);
for (DexProgramClass clazz : partition) {
- MergeGroup newGroup = getOrCreateGroupFor(clazz, newGroupsFromPartition, tracer);
+ HorizontalMergeGroup newGroup = getOrCreateGroupFor(clazz, newGroupsFromPartition, tracer);
if (newGroup != null) {
newGroup.add(clazz);
} else {
@@ -143,22 +144,22 @@
return newGroups;
}
- private void commit(MergeGroup oldGroup, List<MergeGroup> newGroups) {
- for (MergeGroup newGroup : newGroups) {
+ private void commit(HorizontalMergeGroup oldGroup, List<HorizontalMergeGroup> newGroups) {
+ for (HorizontalMergeGroup newGroup : newGroups) {
for (DexProgramClass member : newGroup) {
allGroups.put(member, newGroup);
}
}
for (DexProgramClass member : oldGroup) {
- MergeGroup newGroup = allGroups.get(member);
+ HorizontalMergeGroup newGroup = allGroups.get(member);
if (newGroup == oldGroup) {
allGroups.remove(member);
}
}
}
- private MergeGroup getOrCreateGroupFor(
- DexProgramClass clazz, List<MergeGroup> groups, Tracer tracer) {
+ private HorizontalMergeGroup getOrCreateGroupFor(
+ DexProgramClass clazz, List<HorizontalMergeGroup> groups, Tracer tracer) {
assert !tracer.hasPossibleClassInitializerDeadlock(clazz);
if (clazz.hasClassInitializer()) {
@@ -174,18 +175,18 @@
}
}
- for (MergeGroup group : groups) {
+ for (HorizontalMergeGroup group : groups) {
if (canMerge(clazz, group, tracer)) {
return group;
}
}
- MergeGroup newGroup = new MergeGroup();
+ HorizontalMergeGroup newGroup = new HorizontalMergeGroup();
groups.add(newGroup);
return newGroup;
}
- private boolean canMerge(DexProgramClass clazz, MergeGroup group, Tracer tracer) {
+ private boolean canMerge(DexProgramClass clazz, HorizontalMergeGroup group, Tracer tracer) {
for (DexProgramClass member : group) {
// Check that the class initialization of the given class cannot reach the class initializer
// of the current group member.
@@ -206,7 +207,8 @@
* If the class initializer of one of the classes in the merge group is reached, then that class
* is not eligible for merging.
*/
- private List<MergeGroup> partitionClassesWithPossibleClassInitializerDeadlock(MergeGroup group) {
+ private List<HorizontalMergeGroup> partitionClassesWithPossibleClassInitializerDeadlock(
+ HorizontalMergeGroup group) {
Set<DexProgramClass> superclasses = Sets.newIdentityHashSet();
appView
.appInfo()
@@ -230,13 +232,15 @@
}
tracer.trace();
- MergeGroup notInitializedByInitializationOfParent = new MergeGroup();
- Map<DexProgramClass, MergeGroup> partitioning = new LinkedHashMap<>();
+ HorizontalMergeGroup notInitializedByInitializationOfParent = new HorizontalMergeGroup();
+ Map<DexProgramClass, HorizontalMergeGroup> partitioning = new LinkedHashMap<>();
for (DexProgramClass member : group) {
if (tracer.hasPossibleClassInitializerDeadlock(member)) {
DexProgramClass nearestLock = getNearestLock(member, superclasses);
if (nearestLock != null) {
- partitioning.computeIfAbsent(nearestLock, ignoreKey(MergeGroup::new)).add(member);
+ partitioning
+ .computeIfAbsent(nearestLock, ignoreKey(HorizontalMergeGroup::new))
+ .add(member);
} else {
// Ineligible for merging.
}
@@ -245,7 +249,7 @@
}
}
- return ImmutableList.<MergeGroup>builder()
+ return ImmutableList.<HorizontalMergeGroup>builder()
.add(notInitializedByInitializationOfParent)
.addAll(partitioning.values())
.build();
@@ -276,9 +280,9 @@
}
@Override
- public Void preprocess(Collection<MergeGroup> groups, ExecutorService executorService)
+ public Void preprocess(Collection<HorizontalMergeGroup> groups, ExecutorService executorService)
throws ExecutionException {
- for (MergeGroup group : groups) {
+ for (HorizontalMergeGroup group : groups) {
for (DexProgramClass clazz : group) {
allGroups.put(clazz, group);
}
@@ -296,7 +300,7 @@
private class Tracer {
- final MergeGroup group;
+ final HorizontalMergeGroup group;
// The members of the existing merge group, for efficient membership querying.
final Set<DexProgramClass> groupMembers;
@@ -314,7 +318,7 @@
// group).
private Collection<DexProgramClass> tracingRoots;
- Tracer(MergeGroup group) {
+ Tracer(HorizontalMergeGroup group) {
this.group = group;
this.groupMembers = SetUtils.newIdentityHashSet(group);
}
@@ -469,7 +473,7 @@
worklist.addIfNotSeen(superClass);
}
- MergeGroup other = allGroups.get(clazz);
+ HorizontalMergeGroup other = allGroups.get(clazz);
if (other != null && other != group) {
worklist.addIfNotSeen(other);
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java
index 6d83173..f4b929d 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoConstructorCollisions.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicyWithPreprocessing;
import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.IterableUtils;
@@ -55,9 +55,10 @@
* filtered group.
*/
@Override
- public Collection<MergeGroup> apply(MergeGroup group, Set<DexType> collisionResolution) {
- MergeGroup newGroup =
- new MergeGroup(
+ public Collection<HorizontalMergeGroup> apply(
+ HorizontalMergeGroup group, Set<DexType> collisionResolution) {
+ HorizontalMergeGroup newGroup =
+ new HorizontalMergeGroup(
Iterables.filter(group, clazz -> !collisionResolution.contains(clazz.getType())));
return newGroup.isTrivial() ? Collections.emptyList() : ListUtils.newLinkedList(newGroup);
}
@@ -67,10 +68,11 @@
* lead to constructor collisions.
*/
@Override
- public Set<DexType> preprocess(Collection<MergeGroup> groups, ExecutorService executorService) {
+ public Set<DexType> preprocess(
+ Collection<HorizontalMergeGroup> groups, ExecutorService executorService) {
// Build a mapping from types to groups.
- Map<DexType, MergeGroup> groupsByType = new IdentityHashMap<>();
- for (MergeGroup group : groups) {
+ Map<DexType, HorizontalMergeGroup> groupsByType = new IdentityHashMap<>();
+ for (HorizontalMergeGroup group : groups) {
for (DexProgramClass clazz : group) {
groupsByType.put(clazz.getType(), group);
}
@@ -109,7 +111,7 @@
return collisionResolution;
}
- private DexProto rewriteProto(DexProto proto, Map<DexType, MergeGroup> groups) {
+ private DexProto rewriteProto(DexProto proto, Map<DexType, HorizontalMergeGroup> groups) {
DexType[] parameters =
ArrayUtils.map(
proto.getParameters().values,
@@ -118,7 +120,7 @@
return dexItemFactory.createProto(rewriteType(proto.getReturnType(), groups), parameters);
}
- private DexMethod rewriteReference(DexMethod method, Map<DexType, MergeGroup> groups) {
+ private DexMethod rewriteReference(DexMethod method, Map<DexType, HorizontalMergeGroup> groups) {
return dexItemFactory.createMethod(
rewriteType(method.getHolderType(), groups),
rewriteProto(method.getProto(), groups),
@@ -126,7 +128,7 @@
}
@SuppressWarnings("ReferenceEquality")
- private DexType rewriteType(DexType type, Map<DexType, MergeGroup> groups) {
+ private DexType rewriteType(DexType type, Map<DexType, HorizontalMergeGroup> groups) {
if (type.isArrayType()) {
DexType baseType = type.toBaseType(dexItemFactory);
DexType rewrittenBaseType = rewriteType(baseType, groups);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDeadLocks.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDeadLocks.java
index 7e32fd3..ee9f3a7 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDeadLocks.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDeadLocks.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.Collection;
@@ -28,14 +28,14 @@
// TODO(b/270398965): Replace LinkedList.
@Override
@SuppressWarnings({"JdkObsolete", "MixedMutabilityReturnType"})
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
// Gather all synchronized classes.
- Collection<MergeGroup> synchronizedGroups = new LinkedList<>();
+ Collection<HorizontalMergeGroup> synchronizedGroups = new LinkedList<>();
group.removeIf(
clazz -> {
boolean synchronizationClass = isSynchronizationClass(clazz);
if (synchronizationClass) {
- MergeGroup synchronizedGroup = new MergeGroup();
+ HorizontalMergeGroup synchronizedGroup = new HorizontalMergeGroup();
synchronizedGroup.add(clazz);
synchronizedGroups.add(synchronizedGroup);
}
@@ -46,7 +46,7 @@
return Collections.singletonList(group);
}
- Iterator<MergeGroup> synchronizedGroupIterator = synchronizedGroups.iterator();
+ Iterator<HorizontalMergeGroup> synchronizedGroupIterator = synchronizedGroups.iterator();
for (DexProgramClass clazz : group) {
if (!synchronizedGroupIterator.hasNext()) {
synchronizedGroupIterator = synchronizedGroups.iterator();
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java
index e8494a3..f330807 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodCollisions.java
@@ -19,7 +19,7 @@
import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.graph.TopDownClassHierarchyTraversal;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicyWithPreprocessing;
import com.android.tools.r8.horizontalclassmerging.policies.NoDefaultInterfaceMethodCollisions.InterfaceInfo;
import com.android.tools.r8.utils.IterableUtils;
@@ -82,7 +82,8 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group, Map<DexType, InterfaceInfo> infos) {
+ public Collection<HorizontalMergeGroup> apply(
+ HorizontalMergeGroup group, Map<DexType, InterfaceInfo> infos) {
if (!group.isInterfaceGroup()) {
return ImmutableList.of(group);
}
@@ -95,7 +96,7 @@
// TODO(b/173990042): Consider forming multiple groups instead of just filtering. In practice,
// this rarely leads to much filtering, though, since the use of default methods is somewhat
// limited.
- MergeGroup newGroup = new MergeGroup();
+ HorizontalMergeGroup newGroup = new HorizontalMergeGroup();
for (DexProgramClass clazz : group) {
Set<DexMethod> newDefaultMethodsAddedToClassByMerge =
computeNewDefaultMethodsAddedToClassByMerge(clazz, group, infos);
@@ -107,7 +108,7 @@
}
private Set<DexMethod> computeNewDefaultMethodsAddedToClassByMerge(
- DexProgramClass clazz, MergeGroup group, Map<DexType, InterfaceInfo> infos) {
+ DexProgramClass clazz, HorizontalMergeGroup group, Map<DexType, InterfaceInfo> infos) {
// Run through the other classes in the merge group, and add the default interface methods that
// they declare (or inherit from a super interface) to a set.
Set<DexMethod> newDefaultMethodsAddedToClassByMerge = Sets.newIdentityHashSet();
@@ -146,7 +147,7 @@
@Override
public Map<DexType, InterfaceInfo> preprocess(
- Collection<MergeGroup> groups, ExecutorService executorService) {
+ Collection<HorizontalMergeGroup> groups, ExecutorService executorService) {
SubtypingInfo subtypingInfo = SubtypingInfo.create(appView);
Collection<DexProgramClass> classesOfInterest = computeClassesOfInterest(subtypingInfo);
Map<DexType, DexMethodSignatureSet> inheritedClassMethodsPerClass =
@@ -163,7 +164,7 @@
// Store the computed information for each interface that is subject to merging.
Map<DexType, InterfaceInfo> infos = new IdentityHashMap<>();
- for (MergeGroup group : groups) {
+ for (HorizontalMergeGroup group : groups) {
if (group.isInterfaceGroup()) {
for (DexProgramClass clazz : group) {
infos.put(
@@ -277,13 +278,13 @@
computeDefaultMethodsInheritedBySubclassesPerProgramClass(
Collection<DexProgramClass> classesOfInterest,
Map<DexType, Map<DexMethodSignature, Set<DexMethod>>> inheritedDefaultMethodsPerClass,
- Collection<MergeGroup> groups,
+ Collection<HorizontalMergeGroup> groups,
SubtypingInfo subtypingInfo) {
// Build a mapping from class types to their merge group.
Map<DexType, Iterable<DexProgramClass>> classGroupsByType =
MapUtils.newIdentityHashMap(
builder ->
- Iterables.filter(groups, MergeGroup::isClassGroup)
+ Iterables.filter(groups, HorizontalMergeGroup::isClassGroup)
.forEach(group -> group.forEach(clazz -> builder.put(clazz.getType(), group))));
// Copy the map from classes to their inherited default methods.
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java
index e466650..318a2af 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.utils.WorkList;
import com.android.tools.r8.utils.collections.DexMethodSignatureMap;
@@ -43,11 +43,11 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
// Split the group into smaller groups such that no default methods collide.
// TODO(b/229951607): This fixes the ICCE issue for synthetic lambda classes, but a more
// general solution possibly extending the policy NoDefaultInterfaceMethodCollisions.
- Map<MergeGroup, DexMethodSignatureMap<DexType>> newGroups = new LinkedHashMap<>();
+ Map<HorizontalMergeGroup, DexMethodSignatureMap<DexType>> newGroups = new LinkedHashMap<>();
for (DexProgramClass clazz : group) {
addClassToGroup(
clazz,
@@ -63,14 +63,14 @@
@SuppressWarnings("ReferenceEquality")
private void addClassToGroup(
DexProgramClass clazz,
- Map<MergeGroup, DexMethodSignatureMap<DexType>> newGroups,
+ Map<HorizontalMergeGroup, DexMethodSignatureMap<DexType>> newGroups,
Function<DexProgramClass, DexMethodSignatureMap<DexType>> fn) {
DexMethodSignatureMap<DexType> classSignatures = fn.apply(clazz);
// Find a group that does not have any collisions with `clazz`.
nextGroup:
- for (Entry<MergeGroup, DexMethodSignatureMap<DexType>> entry : newGroups.entrySet()) {
- MergeGroup group = entry.getKey();
+ for (Entry<HorizontalMergeGroup, DexMethodSignatureMap<DexType>> entry : newGroups.entrySet()) {
+ HorizontalMergeGroup group = entry.getKey();
DexMethodSignatureMap<DexType> groupSignatures = entry.getValue();
if (!groupSignatures.containsAnyKeyOf(classSignatures.keySet())) {
groupSignatures.putAll(classSignatures);
@@ -92,7 +92,7 @@
}
// Else create a new group.
- newGroups.put(new MergeGroup(clazz), classSignatures);
+ newGroups.put(new HorizontalMergeGroup(clazz), classSignatures);
}
@SuppressWarnings("ReferenceEquality")
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java
index aef65d3..b792e84 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceInitializerMerging.java
@@ -19,13 +19,13 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.horizontalclassmerging.ClassInstanceFieldsMerger;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.IRCodeProvider;
import com.android.tools.r8.horizontalclassmerging.InstanceInitializerAnalysis;
import com.android.tools.r8.horizontalclassmerging.InstanceInitializerAnalysis.AbsentInstanceInitializer;
import com.android.tools.r8.horizontalclassmerging.InstanceInitializerAnalysis.InstanceInitializer;
import com.android.tools.r8.horizontalclassmerging.InstanceInitializerAnalysis.PresentInstanceInitializer;
import com.android.tools.r8.horizontalclassmerging.InstanceInitializerDescription;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicyWithPreprocessing;
import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.ListUtils;
@@ -73,7 +73,7 @@
@Override
@SuppressWarnings("MixedMutabilityReturnType")
public Map<DexProgramClass, Set<DexMethod>> preprocess(
- Collection<MergeGroup> groups, ExecutorService executorService) {
+ Collection<HorizontalMergeGroup> groups, ExecutorService executorService) {
if (!appView.options().canHaveNonReboundConstructorInvoke()) {
return Collections.emptyMap();
}
@@ -118,8 +118,8 @@
@Override
@SuppressWarnings("MixedMutabilityReturnType")
- public Collection<MergeGroup> apply(
- MergeGroup group, Map<DexProgramClass, Set<DexMethod>> absentInstanceInitializers) {
+ public Collection<HorizontalMergeGroup> apply(
+ HorizontalMergeGroup group, Map<DexProgramClass, Set<DexMethod>> absentInstanceInitializers) {
assert !group.hasTarget();
assert !group.hasInstanceFieldMap();
@@ -148,7 +148,8 @@
group.selectTarget(appView);
group.selectInstanceFieldMap(appView);
- Map<MergeGroup, Map<DexMethodSignature, InstanceInitializer>> newGroups = new LinkedHashMap<>();
+ Map<HorizontalMergeGroup, Map<DexMethodSignature, InstanceInitializer>> newGroups =
+ new LinkedHashMap<>();
// Caching of instance initializer descriptions, which are used to determine equivalence.
// TODO(b/181846319): Make this cache available to the instance initializer merger so that we
@@ -164,12 +165,12 @@
// Partition group into smaller groups where there are no (non-equivalent) instance initializer
// collisions.
for (DexProgramClass clazz : group) {
- MergeGroup newGroup = null;
+ HorizontalMergeGroup newGroup = null;
Map<DexMethodSignature, InstanceInitializer> classInstanceInitializers =
getInstanceInitializersByRelaxedSignature(clazz, absentInstanceInitializers);
- for (Entry<MergeGroup, Map<DexMethodSignature, InstanceInitializer>> entry :
+ for (Entry<HorizontalMergeGroup, Map<DexMethodSignature, InstanceInitializer>> entry :
newGroups.entrySet()) {
- MergeGroup candidateGroup = entry.getKey();
+ HorizontalMergeGroup candidateGroup = entry.getKey();
Map<DexMethodSignature, InstanceInitializer> groupInstanceInitializers = entry.getValue();
if (canAddClassToGroup(
classInstanceInitializers,
@@ -183,12 +184,12 @@
if (newGroup != null) {
newGroup.add(clazz);
} else {
- newGroups.put(new MergeGroup(clazz), classInstanceInitializers);
+ newGroups.put(new HorizontalMergeGroup(clazz), classInstanceInitializers);
}
}
// Remove trivial groups and finalize the newly created groups.
- Collection<MergeGroup> newNonTrivialGroups = removeTrivialGroups(newGroups.keySet());
+ Collection<HorizontalMergeGroup> newNonTrivialGroups = removeTrivialGroups(newGroups.keySet());
setInstanceFieldMaps(newNonTrivialGroups, group);
return newNonTrivialGroups;
}
@@ -265,7 +266,7 @@
}
private Optional<InstanceInitializerDescription> getOrComputeInstanceInitializerDescription(
- MergeGroup group,
+ HorizontalMergeGroup group,
InstanceInitializer instanceInitializer,
Map<DexMethod, Optional<InstanceInitializerDescription>> instanceInitializerDescriptions) {
return instanceInitializerDescriptions.computeIfAbsent(
@@ -296,8 +297,9 @@
: instanceInitializerReference;
}
- private void setInstanceFieldMaps(Iterable<MergeGroup> newGroups, MergeGroup group) {
- for (MergeGroup newGroup : newGroups) {
+ private void setInstanceFieldMaps(
+ Iterable<HorizontalMergeGroup> newGroups, HorizontalMergeGroup group) {
+ for (HorizontalMergeGroup newGroup : newGroups) {
// Set target.
newGroup.selectTarget(appView);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoVirtualMethodMerging.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoVirtualMethodMerging.java
index 07b2fc7..21283e1 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoVirtualMethodMerging.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoVirtualMethodMerging.java
@@ -14,7 +14,7 @@
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.SetUtils;
@@ -40,17 +40,19 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
- Map<MergeGroup, Map<DexMethodSignature, ProgramMethod>> newGroups = new LinkedHashMap<>();
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
+ Map<HorizontalMergeGroup, Map<DexMethodSignature, ProgramMethod>> newGroups =
+ new LinkedHashMap<>();
for (DexProgramClass clazz : group) {
Map<DexMethodSignature, ProgramMethod> classMethods = new HashMap<>();
clazz.forEachProgramVirtualMethodMatching(
DexEncodedMethod::isNonAbstractVirtualMethod,
method -> classMethods.put(method.getMethodSignature(), method));
- MergeGroup newGroup = null;
- for (Entry<MergeGroup, Map<DexMethodSignature, ProgramMethod>> entry : newGroups.entrySet()) {
- MergeGroup candidateGroup = entry.getKey();
+ HorizontalMergeGroup newGroup = null;
+ for (Entry<HorizontalMergeGroup, Map<DexMethodSignature, ProgramMethod>> entry :
+ newGroups.entrySet()) {
+ HorizontalMergeGroup candidateGroup = entry.getKey();
Map<DexMethodSignature, ProgramMethod> groupMethods = entry.getValue();
if (canAddNonAbstractVirtualMethodsToGroup(
clazz, classMethods.values(), candidateGroup, groupMethods)) {
@@ -63,7 +65,7 @@
if (newGroup != null) {
newGroup.add(clazz);
} else {
- newGroups.put(new MergeGroup(clazz), classMethods);
+ newGroups.put(new HorizontalMergeGroup(clazz), classMethods);
}
}
return removeTrivialGroups(newGroups.keySet());
@@ -72,7 +74,7 @@
private boolean canAddNonAbstractVirtualMethodsToGroup(
DexProgramClass clazz,
Collection<ProgramMethod> methods,
- MergeGroup group,
+ HorizontalMergeGroup group,
Map<DexMethodSignature, ProgramMethod> groupMethods) {
// For each of clazz' virtual methods, check that adding these methods to the group does not
// require method merging.
@@ -92,7 +94,8 @@
return true;
}
- private boolean hasNonAbstractDefinitionInHierarchy(MergeGroup group, ProgramMethod method) {
+ private boolean hasNonAbstractDefinitionInHierarchy(
+ HorizontalMergeGroup group, ProgramMethod method) {
return hasNonAbstractDefinitionInSuperClass(group.getSuperType(), method)
|| hasNonAbstractDefinitionInSuperInterface(
SetUtils.newIdentityHashSet(IterableUtils.flatMap(group, DexClass::getInterfaces)),
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java
index 2305438..3daa113 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoWeakerAccessPrivileges.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ImmediateProgramSubtypingInfo;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.optimize.argumentpropagation.utils.ProgramClassesBidirectedGraph;
import com.android.tools.r8.utils.collections.DexMethodSignatureSet;
@@ -46,14 +46,14 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
- List<MergeGroup> newMergeGroups = new LinkedList<>();
- Map<MergeGroup, DexMethodSignatureSet> inheritedInterfaceMethodsPerGroup =
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
+ List<HorizontalMergeGroup> newMergeGroups = new LinkedList<>();
+ Map<HorizontalMergeGroup, DexMethodSignatureSet> inheritedInterfaceMethodsPerGroup =
new IdentityHashMap<>();
for (DexProgramClass clazz : group) {
// Find an existing merge group that the current class can be added to.
- MergeGroup newMergeGroup = null;
- for (MergeGroup candidateMergeGroup : newMergeGroups) {
+ HorizontalMergeGroup newMergeGroup = null;
+ for (HorizontalMergeGroup candidateMergeGroup : newMergeGroups) {
DexMethodSignatureSet inheritedInterfaceMethodsInGroup =
inheritedInterfaceMethodsPerGroup.get(candidateMergeGroup);
if (canAddToGroup(clazz, candidateMergeGroup, inheritedInterfaceMethodsInGroup)) {
@@ -65,7 +65,7 @@
DexMethodSignatureSet inheritedInterfaceMethodsInGroup;
if (newMergeGroup == null) {
// Form a new singleton merge group from the current class.
- newMergeGroup = new MergeGroup(clazz);
+ newMergeGroup = new HorizontalMergeGroup(clazz);
newMergeGroups.add(newMergeGroup);
inheritedInterfaceMethodsInGroup = DexMethodSignatureSet.create();
inheritedInterfaceMethodsPerGroup.put(newMergeGroup, inheritedInterfaceMethodsInGroup);
@@ -86,7 +86,7 @@
private boolean canAddToGroup(
DexProgramClass clazz,
- MergeGroup group,
+ HorizontalMergeGroup group,
DexMethodSignatureSet inheritedInterfaceMethodsInGroup) {
// We need to ensure that adding class to the group is OK.
DexMethodSignatureSet nonPublicVirtualMethodSignaturesInClassComponent =
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/OnlyDirectlyConnectedOrUnrelatedInterfaces.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/OnlyDirectlyConnectedOrUnrelatedInterfaces.java
index 9812a26..db74f25 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/OnlyDirectlyConnectedOrUnrelatedInterfaces.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/OnlyDirectlyConnectedOrUnrelatedInterfaces.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicyWithPreprocessing;
import com.android.tools.r8.utils.SetUtils;
import com.android.tools.r8.utils.WorkList;
@@ -62,7 +62,7 @@
private final Mode mode;
// The interface merge groups that this policy has committed to so far.
- private final Map<DexProgramClass, MergeGroup> committed = new IdentityHashMap<>();
+ private final Map<DexProgramClass, HorizontalMergeGroup> committed = new IdentityHashMap<>();
public OnlyDirectlyConnectedOrUnrelatedInterfaces(
AppView<? extends AppInfoWithClassHierarchy> appView, Mode mode) {
@@ -73,7 +73,8 @@
// TODO(b/270398965): Replace LinkedList.
@Override
@SuppressWarnings({"JdkObsolete", "MixedMutabilityReturnType"})
- public Collection<MergeGroup> apply(MergeGroup group, SubtypingInfo subtypingInfo) {
+ public Collection<HorizontalMergeGroup> apply(
+ HorizontalMergeGroup group, SubtypingInfo subtypingInfo) {
if (!group.isInterfaceGroup()) {
return ImmutableList.of(group);
}
@@ -104,9 +105,9 @@
committed.put(clazz, newGroup.getGroup());
}
- List<MergeGroup> newGroups = new LinkedList<>();
+ List<HorizontalMergeGroup> newGroups = new LinkedList<>();
for (MergeGroupWithInfo newGroupWithInfo : newGroupsWithInfo) {
- MergeGroup newGroup = newGroupWithInfo.getGroup();
+ HorizontalMergeGroup newGroup = newGroupWithInfo.getGroup();
if (newGroup.isTrivial()) {
assert !newGroup.isEmpty();
committed.remove(newGroup.getClasses().getFirst());
@@ -135,7 +136,7 @@
workList.addIgnoringSeenSet(clazz);
workList.process(
interfaceDefinition -> {
- MergeGroup group = committed.get(interfaceDefinition);
+ HorizontalMergeGroup group = committed.get(interfaceDefinition);
if (group != null) {
workList.addIfNotSeen(group);
}
@@ -163,7 +164,8 @@
}
@Override
- public SubtypingInfo preprocess(Collection<MergeGroup> groups, ExecutorService executorService) {
+ public SubtypingInfo preprocess(
+ Collection<HorizontalMergeGroup> groups, ExecutorService executorService) {
return SubtypingInfo.create(appView);
}
@@ -174,7 +176,7 @@
static class MergeGroupWithInfo {
- private final MergeGroup group;
+ private final HorizontalMergeGroup group;
private final Set<DexProgramClass> members;
private final Set<DexProgramClass> superInterfaces;
private final Set<DexProgramClass> subInterfaces;
@@ -183,7 +185,7 @@
DexProgramClass clazz,
Set<DexProgramClass> superInterfaces,
Set<DexProgramClass> subInterfaces) {
- this.group = new MergeGroup(clazz);
+ this.group = new HorizontalMergeGroup(clazz);
this.members = SetUtils.newIdentityHashSet(clazz);
this.superInterfaces = superInterfaces;
this.subInterfaces = subInterfaces;
@@ -206,7 +208,7 @@
subInterfaces.remove(clazz);
}
- MergeGroup getGroup() {
+ HorizontalMergeGroup getGroup() {
return group;
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java
index 63e334b..b891bcd 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.OptionalBool;
@@ -101,10 +101,10 @@
public static class TargetGroup {
- private final MergeGroup group = new MergeGroup();
+ private final HorizontalMergeGroup group = new HorizontalMergeGroup();
private final Map<DexMethodSignature, MethodCharacteristics> methodMap = new HashMap<>();
- public MergeGroup getGroup() {
+ public HorizontalMergeGroup getGroup() {
return group;
}
@@ -139,7 +139,7 @@
// TODO(b/270398965): Replace LinkedList.
@SuppressWarnings("JdkObsolete")
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
List<TargetGroup> groups = new ArrayList<>();
for (DexProgramClass clazz : group) {
@@ -152,7 +152,7 @@
}
}
- LinkedList<MergeGroup> newGroups = new LinkedList<>();
+ LinkedList<HorizontalMergeGroup> newGroups = new LinkedList<>();
for (TargetGroup newGroup : groups) {
if (!newGroup.getGroup().isTrivial()) {
newGroups.add(newGroup.getGroup());
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventClassMethodAndDefaultMethodCollisions.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventClassMethodAndDefaultMethodCollisions.java
index 2a3602c..06e39d7 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventClassMethodAndDefaultMethodCollisions.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventClassMethodAndDefaultMethodCollisions.java
@@ -14,7 +14,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ImmediateProgramSubtypingInfo;
import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.utils.collections.DexMethodSignatureSet;
import com.google.common.collect.ImmutableList;
@@ -151,7 +151,7 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
// This policy is specific to issues that may arise from merging (non-interface) classes.
if (group.isInterfaceGroup()) {
return ImmutableList.of(group);
@@ -162,7 +162,7 @@
signatures.addAllMethods(clazz.methods());
}
- Map<DispatchSignature, MergeGroup> newGroups = new LinkedHashMap<>();
+ Map<DispatchSignature, HorizontalMergeGroup> newGroups = new LinkedHashMap<>();
for (DexProgramClass clazz : group) {
DexMethodSignatureSet clazzReserved = computeReservedSignaturesForClass(clazz);
DispatchSignature dispatchSignature = new DispatchSignature();
@@ -178,7 +178,7 @@
}
dispatchSignature.addSignature(signature, category);
}
- newGroups.computeIfAbsent(dispatchSignature, ignore -> new MergeGroup()).add(clazz);
+ newGroups.computeIfAbsent(dispatchSignature, ignore -> new HorizontalMergeGroup()).add(clazz);
}
return removeTrivialGroups(newGroups.values());
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java
index 29a9147..bfc4cd1 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java
@@ -15,7 +15,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.utils.TraversalContinuation;
import com.android.tools.r8.verticalclassmerging.IllegalAccessDetector;
@@ -122,10 +122,12 @@
/** Sort unrestricted classes into restricted classes if they are in the same package. */
void tryFindRestrictedPackage(
- MergeGroup unrestrictedClasses, Map<String, MergeGroup> restrictedClasses) {
+ HorizontalMergeGroup unrestrictedClasses,
+ Map<String, HorizontalMergeGroup> restrictedClasses) {
unrestrictedClasses.removeIf(
clazz -> {
- MergeGroup restrictedPackage = restrictedClasses.get(clazz.type.getPackageDescriptor());
+ HorizontalMergeGroup restrictedPackage =
+ restrictedClasses.get(clazz.type.getPackageDescriptor());
if (restrictedPackage != null) {
restrictedPackage.add(clazz);
return true;
@@ -135,15 +137,16 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
- Map<String, MergeGroup> restrictedClasses = new LinkedHashMap<>();
- MergeGroup unrestrictedClasses = new MergeGroup();
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
+ Map<String, HorizontalMergeGroup> restrictedClasses = new LinkedHashMap<>();
+ HorizontalMergeGroup unrestrictedClasses = new HorizontalMergeGroup();
// Sort all restricted classes into packages.
for (DexProgramClass clazz : group) {
if (shouldRestrictMergingAcrossPackageBoundary(clazz)) {
restrictedClasses
- .computeIfAbsent(clazz.getType().getPackageDescriptor(), ignore -> new MergeGroup())
+ .computeIfAbsent(
+ clazz.getType().getPackageDescriptor(), ignore -> new HorizontalMergeGroup())
.add(clazz);
} else {
unrestrictedClasses.add(clazz);
@@ -155,7 +158,7 @@
// TODO(b/166577694): Add the unrestricted classes to restricted groups, but ensure they aren't
// the merge target.
- Collection<MergeGroup> groups = new ArrayList<>(restrictedClasses.size() + 1);
+ Collection<HorizontalMergeGroup> groups = new ArrayList<>(restrictedClasses.size() + 1);
if (unrestrictedClasses.size() > 1) {
groups.add(unrestrictedClasses);
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SamePackageForNonGlobalMergeSynthetic.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SamePackageForNonGlobalMergeSynthetic.java
index db6d282..a95bafe 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SamePackageForNonGlobalMergeSynthetic.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SamePackageForNonGlobalMergeSynthetic.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.google.common.collect.Iterables;
@@ -28,10 +28,12 @@
/** Sort unrestricted classes into restricted classes if they are in the same package. */
private void tryFindRestrictedPackage(
- MergeGroup unrestrictedClasses, Map<String, MergeGroup> restrictedClasses) {
+ HorizontalMergeGroup unrestrictedClasses,
+ Map<String, HorizontalMergeGroup> restrictedClasses) {
unrestrictedClasses.removeIf(
clazz -> {
- MergeGroup restrictedPackage = restrictedClasses.get(clazz.type.getPackageDescriptor());
+ HorizontalMergeGroup restrictedPackage =
+ restrictedClasses.get(clazz.type.getPackageDescriptor());
if (restrictedPackage != null) {
restrictedPackage.add(clazz);
return true;
@@ -41,9 +43,9 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
- Map<String, MergeGroup> restrictedClasses = new LinkedHashMap<>();
- MergeGroup unrestrictedClasses = new MergeGroup();
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
+ Map<String, HorizontalMergeGroup> restrictedClasses = new LinkedHashMap<>();
+ HorizontalMergeGroup unrestrictedClasses = new HorizontalMergeGroup();
SyntheticItems syntheticItems = appView.getSyntheticItems();
// Sort all restricted classes into packages.
@@ -56,7 +58,7 @@
|| !kind.asSyntheticMethodKind().isAllowGlobalMerging())) {
restrictedClasses
.computeIfAbsent(
- clazz.getType().getPackageDescriptor(), ignoreArgument(MergeGroup::new))
+ clazz.getType().getPackageDescriptor(), ignoreArgument(HorizontalMergeGroup::new))
.add(clazz);
} else {
unrestrictedClasses.add(clazz);
@@ -66,7 +68,7 @@
tryFindRestrictedPackage(unrestrictedClasses, restrictedClasses);
removeTrivialGroups(restrictedClasses.values());
- Collection<MergeGroup> groups = new ArrayList<>(restrictedClasses.size() + 1);
+ Collection<HorizontalMergeGroup> groups = new ArrayList<>(restrictedClasses.size() + 1);
if (unrestrictedClasses.size() > 1) {
groups.add(unrestrictedClasses);
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/VerifyMultiClassPolicyAlwaysSatisfied.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/VerifyMultiClassPolicyAlwaysSatisfied.java
index 7ad1e60..e62195b 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/VerifyMultiClassPolicyAlwaysSatisfied.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/VerifyMultiClassPolicyAlwaysSatisfied.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.horizontalclassmerging.policies;
-import com.android.tools.r8.horizontalclassmerging.MergeGroup;
+import com.android.tools.r8.horizontalclassmerging.HorizontalMergeGroup;
import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy;
import com.android.tools.r8.utils.InternalOptions;
import java.util.Collection;
@@ -29,15 +29,15 @@
}
@Override
- public Collection<MergeGroup> apply(MergeGroup group) {
+ public Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group) {
assert verifySameAppliedGroup(group);
return Collections.singletonList(group);
}
- private boolean verifySameAppliedGroup(MergeGroup group) {
- Collection<MergeGroup> applied = policy.apply(group);
+ private boolean verifySameAppliedGroup(HorizontalMergeGroup group) {
+ Collection<HorizontalMergeGroup> applied = policy.apply(group);
assert applied.size() == 1;
- MergeGroup appliedGroup = applied.iterator().next();
+ HorizontalMergeGroup appliedGroup = applied.iterator().next();
assert appliedGroup.size() == group.size() && group.containsAll(appliedGroup);
return true;
}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index e069c30..24a5e7e 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -26,6 +26,7 @@
import com.android.tools.r8.Version;
import com.android.tools.r8.androidapi.ComputedApiLevel;
import com.android.tools.r8.cf.CfVersion;
+import com.android.tools.r8.classmerging.Policy;
import com.android.tools.r8.debuginfo.DebugRepresentation;
import com.android.tools.r8.dex.ApplicationReader.ProgramClassConflictResolver;
import com.android.tools.r8.dex.Constants;
@@ -66,7 +67,6 @@
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger;
import com.android.tools.r8.horizontalclassmerging.HorizontallyMergedClasses;
-import com.android.tools.r8.horizontalclassmerging.Policy;
import com.android.tools.r8.inspector.internal.InspectorImpl;
import com.android.tools.r8.ir.analysis.proto.ProtoReferences;
import com.android.tools.r8.ir.analysis.type.TypeElement;
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicy.java b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicy.java
index 9635b3c..5ecda24 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicy.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicy.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.androidapi.AndroidApiLevelCompute;
import com.android.tools.r8.androidapi.ComputedApiLevel;
+import com.android.tools.r8.classmerging.Policy;
import com.android.tools.r8.features.FeatureSplitBoundaryOptimizationUtils;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
@@ -20,7 +21,6 @@
import com.android.tools.r8.graph.LookupResult.LookupResultSuccess;
import com.android.tools.r8.graph.ObjectAllocationInfoCollection;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.horizontalclassmerging.Policy;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.profile.startup.optimization.StartupBoundaryOptimizationUtils;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicyExecutor.java b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicyExecutor.java
index e55dacb..6a0438c 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicyExecutor.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerPolicyExecutor.java
@@ -3,11 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.verticalclassmerging;
+import com.android.tools.r8.classmerging.Policy;
+import com.android.tools.r8.classmerging.PolicyExecutor;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ImmediateProgramSubtypingInfo;
-import com.android.tools.r8.horizontalclassmerging.Policy;
-import com.android.tools.r8.horizontalclassmerging.PolicyExecutor;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.Timing;
@@ -18,7 +18,6 @@
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
-// TODO(b/315252934): Parallelize policy execution over connected program components.
public class VerticalClassMergerPolicyExecutor extends PolicyExecutor<VerticalMergeGroup> {
private final AppView<AppInfoWithLiveness> appView;
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalMergeGroup.java b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalMergeGroup.java
index 28b2a82..1b434ea 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalMergeGroup.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalMergeGroup.java
@@ -3,10 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.verticalclassmerging;
+import com.android.tools.r8.classmerging.MergeGroup;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.horizontalclassmerging.MergeGroupBase;
-public class VerticalMergeGroup extends MergeGroupBase {
+public class VerticalMergeGroup extends MergeGroup {
private final DexProgramClass source;
private final DexProgramClass target;
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClinitDeadlockAfterMergingMultipleGroupsTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClinitDeadlockAfterMergingMultipleGroupsTest.java
index 635ff0e..b2dc326 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClinitDeadlockAfterMergingMultipleGroupsTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClinitDeadlockAfterMergingMultipleGroupsTest.java
@@ -7,9 +7,9 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.classmerging.Policy;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.horizontalclassmerging.MultiClassSameReferencePolicy;
-import com.android.tools.r8.horizontalclassmerging.Policy;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
import org.junit.runner.RunWith;