Avoid merging classes matched by -checkdiscard
Change-Id: I96934470c741b374921238c636aaf79f884cb947
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 eea0202..162ad98 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.horizontalclassmerging.policies.LimitClassGroups;
import com.android.tools.r8.horizontalclassmerging.policies.MinimizeInstanceFieldCasts;
import com.android.tools.r8.horizontalclassmerging.policies.NoAnnotationClasses;
+import com.android.tools.r8.horizontalclassmerging.policies.NoCheckDiscard;
import com.android.tools.r8.horizontalclassmerging.policies.NoClassAnnotationCollisions;
import com.android.tools.r8.horizontalclassmerging.policies.NoClassInitializerWithObservableSideEffects;
import com.android.tools.r8.horizontalclassmerging.policies.NoConstructorCollisions;
@@ -103,6 +104,7 @@
ImmutableList.Builder<SingleClassPolicy> builder) {
builder.add(
new CheckSyntheticClasses(appView),
+ new NoCheckDiscard(appView),
new NoKeepRules(appView),
new NoClassInitializerWithObservableSideEffects());
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoCheckDiscard.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoCheckDiscard.java
new file mode 100644
index 0000000..1266e1d
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoCheckDiscard.java
@@ -0,0 +1,33 @@
+// Copyright (c) 2021, 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.policies;
+
+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.SingleClassPolicy;
+import com.android.tools.r8.shaking.KeepInfoCollection;
+import com.android.tools.r8.utils.InternalOptions;
+
+public class NoCheckDiscard extends SingleClassPolicy {
+
+ private final KeepInfoCollection keepInfo;
+ private final InternalOptions options;
+
+ public NoCheckDiscard(AppView<? extends AppInfoWithClassHierarchy> appView) {
+ this.keepInfo = appView.getKeepInfo();
+ this.options = appView.options();
+ }
+
+ @Override
+ public boolean canMerge(DexProgramClass clazz) {
+ return !keepInfo.getClassInfo(clazz).isCheckDiscardedEnabled(options);
+ }
+
+ @Override
+ public String getName() {
+ return "NoCheckDiscard";
+ }
+}