[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;
+    }
+  }
+}