Fix inadequate force inlining with startup profile

Bug: b/284334258
Change-Id: Idc8fbd95cd3973401d47b3c9182cfbe28b0abbb8
diff --git a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
index f9acf30..b252ad4 100644
--- a/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
+++ b/src/main/java/com/android/tools/r8/features/FeatureSplitBoundaryOptimizationUtils.java
@@ -66,20 +66,23 @@
     }
 
     // Next perform startup checks.
-    StartupProfile startupProfile = appView.getStartupProfile();
-    OptionalBool callerIsStartupMethod = isStartupMethod(caller, startupProfile);
-    if (callerIsStartupMethod.isTrue()) {
-      // If the caller is a startup method, then only allow inlining if the callee is also a startup
-      // method.
-      if (isStartupMethod(callee, startupProfile).isFalse()) {
-        return false;
-      }
-    } else if (callerIsStartupMethod.isFalse()) {
-      // If the caller is not a startup method, then only allow inlining if the caller is not a
-      // startup class or the callee is a startup class.
-      if (startupProfile.isStartupClass(caller.getHolderType())
-          && !startupProfile.isStartupClass(callee.getHolderType())) {
-        return false;
+    if (!callee.getOptimizationInfo().forceInline()) {
+      StartupProfile startupProfile = appView.getStartupProfile();
+      OptionalBool callerIsStartupMethod = isStartupMethod(caller, startupProfile);
+      if (callerIsStartupMethod.isTrue()) {
+        // If the caller is a startup method, then only allow inlining if the callee is also a
+        // startup
+        // method.
+        if (isStartupMethod(callee, startupProfile).isFalse()) {
+          return false;
+        }
+      } else if (callerIsStartupMethod.isFalse()) {
+        // If the caller is not a startup method, then only allow inlining if the caller is not a
+        // startup class or the callee is a startup class.
+        if (startupProfile.isStartupClass(caller.getHolderType())
+            && !startupProfile.isStartupClass(callee.getHolderType())) {
+          return false;
+        }
       }
     }
     return true;
diff --git a/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java b/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
index 745d0aa..b3951cc 100644
--- a/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
+++ b/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
@@ -4,14 +4,10 @@
 
 package com.android.tools.r8.startup;
 
-import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.startup.profile.ExternalStartupClass;
 import com.android.tools.r8.startup.profile.ExternalStartupItem;
@@ -54,32 +50,16 @@
             ExternalStartupMethod.builder()
                 .setMethodReference(MethodReferenceUtils.instanceConstructor(B.class))
                 .build());
-
-    // TODO(b/284334258): Test should always succeed with "B".
-    R8TestCompileResult compileResult;
-    try {
-      compileResult =
-          testForR8(parameters.getBackend())
-              .addInnerClasses(getClass())
-              .addKeepMainRule(Main.class)
-              .addVerticallyMergedClassesInspector(
-                  inspector -> inspector.assertMergedIntoSubtype(A.class))
-              .apply(
-                  testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupProfile))
-              .setMinApi(parameters)
-              .compile();
-    } catch (CompilationFailedException e) {
-      assertTrue(parameters.isCfRuntime());
-      return;
-    }
-
-    assertTrue(parameters.isDexRuntime());
-    compileResult
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(Main.class)
+        .addVerticallyMergedClassesInspector(
+            inspector -> inspector.assertMergedIntoSubtype(A.class))
+        .apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupProfile))
+        .setMinApi(parameters)
+        .compile()
         .run(parameters.getRuntime(), Main.class)
-        .applyIf(
-            parameters.getDexRuntimeVersion().isEqualToOneOf(Version.V5_1_1, Version.V6_0_1),
-            runResult -> runResult.assertSuccessWithOutputLines("B"),
-            runResult -> runResult.assertFailureWithErrorThatThrows(VerifyError.class));
+        .assertSuccessWithOutputLines("B");
   }
 
   static class Main {