diff options
author | Christoffer Quist Adamsen <christofferqa@google.com> | 2021-03-09 16:04:58 +0100 |
---|---|---|
committer | Christoffer Quist Adamsen <christofferqa@google.com> | 2021-03-10 14:21:58 +0000 |
commit | 65dd9358547a9d1ad0696f4c0938124f888de3d6 (patch) | |
tree | e19fbbf4c374eaaa5b312a96d744d22f3755bb7e | |
parent | e19391a9443ce502f278a155aba59edba0a124da (diff) | |
download | r8-65dd9358547a9d1ad0696f4c0938124f888de3d6.tar.gz |
Report timing for each policy in horizontal class merging
Fixes: 168670937
Change-Id: I45987fc1befc61472c6b3ac7b735358ab509d71a
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"; + } } |