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 {