aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoffer Quist Adamsen <christofferqa@google.com>2021-03-09 16:04:58 +0100
committerChristoffer Quist Adamsen <christofferqa@google.com>2021-03-10 14:21:58 +0000
commit65dd9358547a9d1ad0696f4c0938124f888de3d6 (patch)
treee19fbbf4c374eaaa5b312a96d744d22f3755bb7e
parente19391a9443ce502f278a155aba59edba0a124da (diff)
downloadr8-65dd9358547a9d1ad0696f4c0938124f888de3d6.tar.gz
Report timing for each policy in horizontal class merging
Fixes: 168670937 Change-Id: I45987fc1befc61472c6b3ac7b735358ab509d71a
-rw-r--r--src/main/java/com/android/tools/r8/R8.java2
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java6
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java2
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java79
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/SimplePolicyExecutor.java85
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AllInstantiatedOrUninstantiated.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckAbstractClasses.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java9
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontMergeSynchronizedClasses.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitGroups.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeFieldCasts.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoAnnotationClasses.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassAnnotationCollisions.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerWithObservableSideEffects.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDirectRuntimeTypeChecks.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIndirectRuntimeTypeChecks.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInnerClasses.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceFieldAnnotations.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInterfaces.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKeepRules.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKotlinMetadata.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoNativeMethods.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoServiceLoaders.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotMatchedByNoHorizontalClassMerging.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotVerticallyMergedIntoSubtype.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreserveMethodCharacteristics.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMergeIntoDifferentMainDexGroups.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMethodImplementation.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/RespectPackageBoundaries.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameNestHost.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameParentClass.java5
-rw-r--r--src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SyntheticItemsPolicy.java5
35 files changed, 233 insertions, 95 deletions
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index b77c8ed7c..56bdfda41 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -496,7 +496,7 @@ public class R8 {
timing.begin("HorizontalClassMerger");
HorizontalClassMerger merger = new HorizontalClassMerger(appViewWithLiveness);
HorizontalClassMergerResult horizontalClassMergerResult =
- merger.run(runtimeTypeCheckInfo);
+ merger.run(runtimeTypeCheckInfo, timing);
if (horizontalClassMergerResult != null) {
// Must rewrite AppInfoWithLiveness before pruning the merged classes, to ensure that
// allocations sites, fields accesses, etc. are correctly transferred to the target
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 46df56991..7085879ab 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
@@ -40,6 +40,7 @@ import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.FieldAccessInfoCollectionModifier;
import com.android.tools.r8.shaking.KeepInfoCollection;
import com.android.tools.r8.shaking.RuntimeTypeCheckInfo;
+import com.android.tools.r8.utils.Timing;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collection;
@@ -55,14 +56,13 @@ public class HorizontalClassMerger {
assert appView.options().enableInlining;
}
- public HorizontalClassMergerResult run(
- RuntimeTypeCheckInfo runtimeTypeCheckInfo) {
+ public HorizontalClassMergerResult run(RuntimeTypeCheckInfo runtimeTypeCheckInfo, Timing timing) {
MergeGroup initialGroup = new MergeGroup(appView.appInfo().classesWithDeterministicOrder());
// Run the policies on all program classes to produce a final grouping.
List<Policy> policies = getPolicies(runtimeTypeCheckInfo);
Collection<MergeGroup> groups =
- new SimplePolicyExecutor().run(Collections.singletonList(initialGroup), policies);
+ new PolicyExecutor().run(Collections.singletonList(initialGroup), policies, timing);
// If there are no groups, then end horizontal class merging.
if (groups.isEmpty()) {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java
index 4642229f4..b984ed5e9 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/Policy.java
@@ -14,6 +14,8 @@ public abstract class Policy {
public void clear() {}
+ public abstract String getName();
+
public boolean shouldSkipPolicy() {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java
index b94adf841..33b6f7fb3 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyExecutor.java
@@ -4,15 +4,88 @@
package com.android.tools.r8.horizontalclassmerging;
+import com.android.tools.r8.utils.IterableUtils;
+import com.android.tools.r8.utils.Timing;
import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
-public abstract class PolicyExecutor {
+/**
+ * This is a simple policy executor that ensures regular sequential execution of policies. It should
+ * primarily be readable and correct. The SimplePolicyExecutor should be a reference implementation,
+ * against which more efficient policy executors can be compared.
+ */
+public class PolicyExecutor {
+
+ // TODO(b/165506334): if performing mutable operation ensure that linked lists are used
+ private void applySingleClassPolicy(SingleClassPolicy policy, LinkedList<MergeGroup> groups) {
+ Iterator<MergeGroup> i = groups.iterator();
+ while (i.hasNext()) {
+ MergeGroup group = i.next();
+ int previousNumberOfClasses = group.size();
+ group.removeIf(clazz -> !policy.canMerge(clazz));
+ policy.numberOfRemovedClasses += previousNumberOfClasses - group.size();
+ if (group.size() < 2) {
+ i.remove();
+ }
+ }
+ }
+
+ private LinkedList<MergeGroup> applyMultiClassPolicy(
+ MultiClassPolicy policy, LinkedList<MergeGroup> groups) {
+ // For each group apply the multi class policy and add all the new groups together.
+ LinkedList<MergeGroup> newGroups = new LinkedList<>();
+ groups.forEach(
+ group -> {
+ int previousNumberOfClasses = group.size();
+ Collection<MergeGroup> policyGroups = policy.apply(group);
+ policyGroups.forEach(newGroup -> newGroup.applyMetadataFrom(group));
+ policy.numberOfRemovedClasses +=
+ previousNumberOfClasses - IterableUtils.sumInt(policyGroups, MergeGroup::size);
+ newGroups.addAll(policyGroups);
+ });
+ return newGroups;
+ }
/**
* Given an initial collection of class groups which can potentially be merged, run all of the
* policies registered to this policy executor on the class groups yielding a new collection of
* class groups.
*/
- public abstract Collection<MergeGroup> run(
- Collection<MergeGroup> classes, Collection<Policy> policies);
+ public Collection<MergeGroup> run(
+ Collection<MergeGroup> inputGroups, Collection<Policy> policies, Timing timing) {
+ LinkedList<MergeGroup> linkedGroups;
+
+ if (inputGroups instanceof LinkedList) {
+ linkedGroups = (LinkedList<MergeGroup>) inputGroups;
+ } else {
+ linkedGroups = new LinkedList<>(inputGroups);
+ }
+
+ for (Policy policy : policies) {
+ if (policy.shouldSkipPolicy()) {
+ continue;
+ }
+
+ timing.begin(policy.getName());
+ if (policy instanceof SingleClassPolicy) {
+ applySingleClassPolicy((SingleClassPolicy) policy, linkedGroups);
+ } else {
+ assert policy instanceof MultiClassPolicy;
+ linkedGroups = applyMultiClassPolicy((MultiClassPolicy) policy, linkedGroups);
+ }
+ timing.end();
+
+ policy.clear();
+
+ if (linkedGroups.isEmpty()) {
+ break;
+ }
+
+ // Any policy should not return any trivial groups.
+ assert linkedGroups.stream().allMatch(group -> group.size() >= 2);
+ }
+
+ return linkedGroups;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/SimplePolicyExecutor.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/SimplePolicyExecutor.java
deleted file mode 100644
index 3b96a767f..000000000
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/SimplePolicyExecutor.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (c) 2020, 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;
-
-import com.android.tools.r8.utils.IterableUtils;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-
-/**
- * This is a simple policy executor that ensures regular sequential execution of policies. It should
- * primarily be readable and correct. The SimplePolicyExecutor should be a reference implementation,
- * against which more efficient policy executors can be compared.
- */
-public class SimplePolicyExecutor extends PolicyExecutor {
-
- // TODO(b/165506334): if performing mutable operation ensure that linked lists are used
- private LinkedList<MergeGroup> applySingleClassPolicy(
- SingleClassPolicy policy, LinkedList<MergeGroup> groups) {
- Iterator<MergeGroup> i = groups.iterator();
- while (i.hasNext()) {
- MergeGroup group = i.next();
- int previousNumberOfClasses = group.size();
- group.removeIf(clazz -> !policy.canMerge(clazz));
- policy.numberOfRemovedClasses += previousNumberOfClasses - group.size();
- if (group.size() < 2) {
- i.remove();
- }
- }
- return groups;
- }
-
- private LinkedList<MergeGroup> applyMultiClassPolicy(
- MultiClassPolicy policy, LinkedList<MergeGroup> groups) {
- // For each group apply the multi class policy and add all the new groups together.
- LinkedList<MergeGroup> newGroups = new LinkedList<>();
- groups.forEach(
- group -> {
- int previousNumberOfClasses = group.size();
- Collection<MergeGroup> policyGroups = policy.apply(group);
- policyGroups.forEach(newGroup -> newGroup.applyMetadataFrom(group));
- policy.numberOfRemovedClasses +=
- previousNumberOfClasses - IterableUtils.sumInt(policyGroups, MergeGroup::size);
- newGroups.addAll(policyGroups);
- });
- return newGroups;
- }
-
- @Override
- public Collection<MergeGroup> run(
- Collection<MergeGroup> inputGroups, Collection<Policy> policies) {
- LinkedList<MergeGroup> linkedGroups;
-
- if (inputGroups instanceof LinkedList) {
- linkedGroups = (LinkedList<MergeGroup>) inputGroups;
- } else {
- linkedGroups = new LinkedList<>(inputGroups);
- }
-
- for (Policy policy : policies) {
- if (policy.shouldSkipPolicy()) {
- continue;
- }
-
- if (policy instanceof SingleClassPolicy) {
- linkedGroups = applySingleClassPolicy((SingleClassPolicy) policy, linkedGroups);
- } else if (policy instanceof MultiClassPolicy) {
- linkedGroups = applyMultiClassPolicy((MultiClassPolicy) policy, linkedGroups);
- }
-
- policy.clear();
-
- if (linkedGroups.isEmpty()) {
- break;
- }
-
- // Any policy should not return any trivial groups.
- assert linkedGroups.stream().allMatch(group -> group.size() >= 2);
- }
-
- return linkedGroups;
- }
-}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AllInstantiatedOrUninstantiated.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AllInstantiatedOrUninstantiated.java
index 75d61d93f..38150db20 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AllInstantiatedOrUninstantiated.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/AllInstantiatedOrUninstantiated.java
@@ -21,4 +21,9 @@ public class AllInstantiatedOrUninstantiated extends MultiClassSameReferencePoli
public Boolean getMergeKey(DexProgramClass clazz) {
return appView.appInfo().isInstantiatedDirectlyOrIndirectly(clazz);
}
+
+ @Override
+ public String getName() {
+ return "AllInstantiatedOrUninstantiated";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckAbstractClasses.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckAbstractClasses.java
index 6e5c71152..e78b19674 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckAbstractClasses.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckAbstractClasses.java
@@ -25,6 +25,11 @@ public class CheckAbstractClasses extends MultiClassSameReferencePolicy<Abstract
}
@Override
+ public String getName() {
+ return "CheckAbstractClasses";
+ }
+
+ @Override
public boolean shouldSkipPolicy() {
// We can just make the target class non-abstract if one of the classes in the group
// is non-abstract.
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java
index f7d121aac..e6e67e0d1 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java
@@ -12,16 +12,14 @@ import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.horizontalclassmerging.SingleClassPolicy;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.shaking.MainDexInfo;
import com.google.common.collect.Iterables;
public class DontInlinePolicy extends SingleClassPolicy {
+
private final AppView<AppInfoWithLiveness> appView;
- private final MainDexInfo mainDexInfo;
public DontInlinePolicy(AppView<AppInfoWithLiveness> appView) {
this.appView = appView;
- this.mainDexInfo = appView.appInfo().getMainDexInfo();
}
private boolean disallowInlining(ProgramMethod method) {
@@ -53,4 +51,9 @@ public class DontInlinePolicy extends SingleClassPolicy {
program.directProgramMethods(),
method -> method.getDefinition().isInstanceInitializer() && disallowInlining(method));
}
+
+ @Override
+ public String getName() {
+ return "DontInlinePolicy";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontMergeSynchronizedClasses.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontMergeSynchronizedClasses.java
index 4372869e0..e1cb9a7e0 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontMergeSynchronizedClasses.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontMergeSynchronizedClasses.java
@@ -56,4 +56,9 @@ public class DontMergeSynchronizedClasses extends MultiClassPolicy {
return synchronizedGroups;
}
+
+ @Override
+ public String getName() {
+ return "DontMergeSynchronizedClasses";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitGroups.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitGroups.java
index 33de8f3b5..80e129296 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitGroups.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/LimitGroups.java
@@ -52,4 +52,9 @@ public class LimitGroups extends MultiClassPolicy {
newGroups.add(newGroup);
return newGroup;
}
+
+ @Override
+ public String getName() {
+ return "LimitGroups";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeFieldCasts.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeFieldCasts.java
index 73e0786df..1ef2f6a18 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeFieldCasts.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/MinimizeFieldCasts.java
@@ -70,4 +70,9 @@ public class MinimizeFieldCasts extends MultiClassPolicy {
}
return fieldTypes;
}
+
+ @Override
+ public String getName() {
+ return "MinimizeFieldCasts";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoAnnotationClasses.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoAnnotationClasses.java
index 1effb8b3b..994301027 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoAnnotationClasses.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoAnnotationClasses.java
@@ -12,4 +12,9 @@ public class NoAnnotationClasses extends SingleClassPolicy {
public boolean canMerge(DexProgramClass program) {
return !program.isAnnotation();
}
+
+ @Override
+ public String getName() {
+ return "NoAnnotationClasses";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassAnnotationCollisions.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassAnnotationCollisions.java
index 9d3d730a6..1a9690157 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassAnnotationCollisions.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassAnnotationCollisions.java
@@ -41,4 +41,9 @@ public class NoClassAnnotationCollisions extends MultiClassPolicy {
}
return removeTrivialGroups(newGroups);
}
+
+ @Override
+ public String getName() {
+ return "NoClassAnnotationCollisions";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerWithObservableSideEffects.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerWithObservableSideEffects.java
index f10d78c83..b156a2eb3 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerWithObservableSideEffects.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerWithObservableSideEffects.java
@@ -28,4 +28,9 @@ public class NoClassInitializerWithObservableSideEffects extends SingleClassPoli
return program.getKotlinInfo().isSyntheticClass()
&& program.getKotlinInfo().asSyntheticClass().isLambda();
}
+
+ @Override
+ public String getName() {
+ return "NoClassInitializerWithObservableSideEffects";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDirectRuntimeTypeChecks.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDirectRuntimeTypeChecks.java
index b0f37665b..17659f872 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDirectRuntimeTypeChecks.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDirectRuntimeTypeChecks.java
@@ -19,4 +19,9 @@ public class NoDirectRuntimeTypeChecks extends SingleClassPolicy {
public boolean canMerge(DexProgramClass clazz) {
return !runtimeTypeCheckInfo.isRuntimeCheckType(clazz);
}
+
+ @Override
+ public String getName() {
+ return "NoDirectRuntimeTypeChecks";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java
index c8a0aabe2..8bea8a4e9 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoEnums.java
@@ -27,6 +27,11 @@ public class NoEnums extends SingleClassPolicy {
}
@Override
+ public String getName() {
+ return "NoEnums";
+ }
+
+ @Override
public boolean canMerge(DexProgramClass program) {
if (program.isEnum()) {
return false;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIndirectRuntimeTypeChecks.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIndirectRuntimeTypeChecks.java
index 7446787a2..8de67d6e1 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIndirectRuntimeTypeChecks.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoIndirectRuntimeTypeChecks.java
@@ -65,4 +65,9 @@ public class NoIndirectRuntimeTypeChecks extends MultiClassSameReferencePolicy<D
}
return false;
}
+
+ @Override
+ public String getName() {
+ return "NoIndirectRuntimeTypeChecks";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInnerClasses.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInnerClasses.java
index cc9f61ca8..1d2682525 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInnerClasses.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInnerClasses.java
@@ -14,4 +14,9 @@ public class NoInnerClasses extends SingleClassPolicy {
// TODO(b/179018501): allow merging classes with inner/outer classes.
return program.getInnerClasses().isEmpty();
}
+
+ @Override
+ public String getName() {
+ return "NoInnerClasses";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceFieldAnnotations.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceFieldAnnotations.java
index 610af7e87..229c0628f 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceFieldAnnotations.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInstanceFieldAnnotations.java
@@ -19,4 +19,9 @@ public class NoInstanceFieldAnnotations extends SingleClassPolicy {
}
return true;
}
+
+ @Override
+ public String getName() {
+ return "NoInstanceFieldAnnotations";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInterfaces.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInterfaces.java
index 63df0de68..d6032e765 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInterfaces.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoInterfaces.java
@@ -13,4 +13,9 @@ public class NoInterfaces extends SingleClassPolicy {
public boolean canMerge(DexProgramClass program) {
return !program.isInterface();
}
+
+ @Override
+ public String getName() {
+ return "NoInterfaces";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKeepRules.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKeepRules.java
index e0a39eb9c..ec8a5aa51 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKeepRules.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKeepRules.java
@@ -49,4 +49,9 @@ public class NoKeepRules extends SingleClassPolicy {
public boolean canMerge(DexProgramClass program) {
return !dontMergeTypes.contains(program.getType());
}
+
+ @Override
+ public String getName() {
+ return "NoKeepRules";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKotlinMetadata.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKotlinMetadata.java
index 1acad7ac8..7783f2073 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKotlinMetadata.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoKotlinMetadata.java
@@ -29,4 +29,9 @@ public class NoKotlinMetadata extends SingleClassPolicy {
.allMatch(member -> member.getKotlinMemberInfo().isNoKotlinInformation());
return true;
}
+
+ @Override
+ public String getName() {
+ return "NoKotlinMetadata";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoNativeMethods.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoNativeMethods.java
index f1a278c5b..a32d08368 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoNativeMethods.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoNativeMethods.java
@@ -14,4 +14,9 @@ public class NoNativeMethods extends SingleClassPolicy {
public boolean canMerge(DexProgramClass program) {
return !Iterables.any(program.methods(), DexEncodedMethod::isNative);
}
+
+ @Override
+ public String getName() {
+ return "NoNativeMethods";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoServiceLoaders.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoServiceLoaders.java
index 1c6ae7782..b1f0d99bf 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoServiceLoaders.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoServiceLoaders.java
@@ -26,4 +26,9 @@ public class NoServiceLoaders extends SingleClassPolicy {
return !appView.appServices().allServiceTypes().contains(program.getType())
&& !allServiceImplementations.contains(program.getType());
}
+
+ @Override
+ public String getName() {
+ return "NoServiceLoaders";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotMatchedByNoHorizontalClassMerging.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotMatchedByNoHorizontalClassMerging.java
index bfe0f2ab0..8751afbe5 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotMatchedByNoHorizontalClassMerging.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotMatchedByNoHorizontalClassMerging.java
@@ -30,4 +30,9 @@ public class NotMatchedByNoHorizontalClassMerging extends SingleClassPolicy {
return !deadEnumLiteMaps.contains(program.getType())
&& !appView.appInfo().isNoHorizontalClassMergingOfType(program.getType());
}
+
+ @Override
+ public String getName() {
+ return "NotMatchedByNoHorizontalClassMerging";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotVerticallyMergedIntoSubtype.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotVerticallyMergedIntoSubtype.java
index 67afbc3a2..92d50d126 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotVerticallyMergedIntoSubtype.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NotVerticallyMergedIntoSubtype.java
@@ -23,4 +23,9 @@ public class NotVerticallyMergedIntoSubtype extends SingleClassPolicy {
}
return !appView.verticallyMergedClasses().hasBeenMergedIntoSubtype(program.type);
}
+
+ @Override
+ public String getName() {
+ return "NotVerticallyMergedIntoSubtype";
+ }
}
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 4a789bad2..c8bb5c648 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
@@ -28,6 +28,11 @@ import java.util.Objects;
*/
public class PreserveMethodCharacteristics extends MultiClassPolicy {
+ @Override
+ public String getName() {
+ return "PreserveMethodCharacteristics";
+ }
+
static class MethodCharacteristics {
private final MethodAccessFlags accessFlags;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMergeIntoDifferentMainDexGroups.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMergeIntoDifferentMainDexGroups.java
index 41c240f1e..38df5cf81 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMergeIntoDifferentMainDexGroups.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMergeIntoDifferentMainDexGroups.java
@@ -29,4 +29,9 @@ public class PreventMergeIntoDifferentMainDexGroups
? mainDexInfo.getMergeKey(clazz, synthetics)
: ineligibleForClassMerging();
}
+
+ @Override
+ public String getName() {
+ return "PreventMergeIntoDifferentMainDexGroups";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMethodImplementation.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMethodImplementation.java
index c7c57c8eb..b18233017 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMethodImplementation.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/PreventMethodImplementation.java
@@ -59,6 +59,11 @@ public class PreventMethodImplementation extends MultiClassPolicy {
private final ReservedInterfaceSignaturesFor reservedInterfaceSignaturesFor =
new ReservedInterfaceSignaturesFor();
+ @Override
+ public String getName() {
+ return "PreventMethodImplementation";
+ }
+
private abstract static class SignaturesCache<C extends DexClass> {
private final Map<DexClass, DexMethodSignatureSet> memoizedSignatures = new IdentityHashMap<>();
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 914fc57b8..78cfe1319 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
@@ -96,4 +96,9 @@ public class RespectPackageBoundaries extends MultiClassPolicy {
groups.addAll(restrictedClasses.values());
return groups;
}
+
+ @Override
+ public String getName() {
+ return "RespectPackageBoundaries";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java
index 20caa50af..b3ec01746 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java
@@ -24,4 +24,9 @@ public class SameFeatureSplit extends MultiClassSameReferencePolicy<FeatureSplit
.getClassToFeatureSplitMap()
.getFeatureSplit(clazz, appView.getSyntheticItems());
}
+
+ @Override
+ public String getName() {
+ return "SameFeatureSplit";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java
index 13e038820..291aae525 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameInstanceFields.java
@@ -34,6 +34,11 @@ public class SameInstanceFields extends MultiClassSameReferencePolicy<Multiset<I
return fields;
}
+ @Override
+ public String getName() {
+ return "SameInstanceFields";
+ }
+
public static class InstanceFieldInfo {
private final FieldAccessFlags accessFlags;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameNestHost.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameNestHost.java
index 88d2984fb..fc8e39c57 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameNestHost.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameNestHost.java
@@ -23,4 +23,9 @@ public class SameNestHost extends MultiClassSameReferencePolicy<DexType> {
public DexType getMergeKey(DexProgramClass clazz) {
return clazz.isInANest() ? clazz.getNestHost() : dexItemFactory.objectType;
}
+
+ @Override
+ public String getName() {
+ return "SameNestHost";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameParentClass.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameParentClass.java
index 12c8e316f..3afa6566e 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameParentClass.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameParentClass.java
@@ -14,4 +14,9 @@ public class SameParentClass extends MultiClassSameReferencePolicy<DexType> {
public DexType getMergeKey(DexProgramClass clazz) {
return clazz.superType;
}
+
+ @Override
+ public String getName() {
+ return "SameParentClass";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SyntheticItemsPolicy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SyntheticItemsPolicy.java
index b012897b3..cbc9b3d8d 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SyntheticItemsPolicy.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SyntheticItemsPolicy.java
@@ -48,4 +48,9 @@ public class SyntheticItemsPolicy extends MultiClassSameReferencePolicy<ClassKin
// Java lambda merging is disabled.
return ineligibleForClassMerging();
}
+
+ @Override
+ public String getName() {
+ return "SyntheticItemsPolicy";
+ }
}