[ApiModel] No merging of api outlines with non outlines in D8
This is shown to have a positive increase in performance since we
could merge this with other synthetics that has the same api level.
Change-Id: Ib8ffd3657d4b210450979cc07e243934b4bf0d7c
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 94577c8..1673079 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.horizontalclassmerging.policies.LimitInterfaceGroups;
import com.android.tools.r8.horizontalclassmerging.policies.MinimizeInstanceFieldCasts;
import com.android.tools.r8.horizontalclassmerging.policies.NoAnnotationClasses;
+import com.android.tools.r8.horizontalclassmerging.policies.NoApiOutlineWithNonApiOutline;
import com.android.tools.r8.horizontalclassmerging.policies.NoCheckDiscard;
import com.android.tools.r8.horizontalclassmerging.policies.NoClassAnnotationCollisions;
import com.android.tools.r8.horizontalclassmerging.policies.NoClassInitializerCycles;
@@ -265,6 +266,7 @@
new SameNestHost(appView),
new SameParentClass(),
new SyntheticItemsPolicy(appView, mode),
+ new NoApiOutlineWithNonApiOutline(appView),
new SamePackageForApiOutline(appView, mode),
new NoDifferentApiReferenceLevel(appView),
new LimitClassGroups(appView));
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoApiOutlineWithNonApiOutline.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoApiOutlineWithNonApiOutline.java
new file mode 100644
index 0000000..3176cb7
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoApiOutlineWithNonApiOutline.java
@@ -0,0 +1,41 @@
+// 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.policies;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.horizontalclassmerging.MultiClassSameReferencePolicy;
+import com.android.tools.r8.horizontalclassmerging.policies.NoApiOutlineWithNonApiOutline.SyntheticKindForMerging;
+
+public class NoApiOutlineWithNonApiOutline
+ extends MultiClassSameReferencePolicy<SyntheticKindForMerging> {
+
+ public enum SyntheticKindForMerging {
+ API_MODEL,
+ NOT_API_MODEL
+ }
+
+ private final AppView<?> appView;
+
+ public NoApiOutlineWithNonApiOutline(AppView<?> appView) {
+ this.appView = appView;
+ }
+
+ @Override
+ public String getName() {
+ return "NoApiOutlineWithNonApiOutline";
+ }
+
+ @Override
+ public SyntheticKindForMerging getMergeKey(DexProgramClass clazz) {
+ if (appView
+ .getSyntheticItems()
+ .isSyntheticOfKind(clazz.getType(), kinds -> kinds.API_MODEL_OUTLINE)) {
+ return SyntheticKindForMerging.API_MODEL;
+ } else {
+ return SyntheticKindForMerging.NOT_API_MODEL;
+ }
+ }
+}