Enable horizontal class merging by default
Change-Id: I26e9901120592a70c688853cfdc8905a69867562
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 69b022d..bbe9387 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -864,9 +864,13 @@
internal.enableLambdaMerging = false;
}
if (!internal.isShrinking()) {
- // If R8 is not shrinking, there is no point in unboxing enums since the unboxed enums
- // will still remain in the program (The application size would actually increase).
+ // If R8 is not shrinking, there is no point in running various optimizations since the
+ // optimized classes will still remain in the program (the application size could increase).
internal.enableEnumUnboxing = false;
+ internal.enableHorizontalClassMerging = false;
+ internal.enableLambdaMerging = false;
+ internal.enableStaticClassMerging = false;
+ internal.enableVerticalClassMerging = false;
}
if (!internal.enableInlining) {
@@ -930,6 +934,7 @@
if (internal.isGeneratingClassFiles()) {
internal.outline.enabled = false;
internal.enableEnumUnboxing = false;
+ internal.enableHorizontalClassMerging = false;
}
// EXPERIMENTAL flags.
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 7fe1a31..ea902d5 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -235,8 +235,7 @@
public boolean enableFieldBitAccessAnalysis =
System.getProperty("com.android.tools.r8.fieldBitAccessAnalysis") != null;
public boolean enableStaticClassMerging = true;
- public boolean enableHorizontalClassMerging =
- System.getProperty("com.android.tools.r8.horizontalClassMerging") != null;
+ public boolean enableHorizontalClassMerging = true;
public boolean enableVerticalClassMerging = true;
public boolean enableArgumentRemoval = true;
public boolean enableUnusedInterfaceRemoval = true;
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 0bf3362..0b9c896 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -179,10 +179,7 @@
.withBuilderTransformation(ToolHelper::allowTestProguardOptions)
.withBuilderTransformation(
b -> b.addProguardConfiguration(PROGUARD_OPTIONS_N_PLUS, Origin.unknown()))
- .withDexCheck(
- inspector ->
- checkLambdaCount(
- inspector, isHorizontalClassMergingEnabled() ? 3 : 2, "lambdadesugaringnplus"))
+ .withDexCheck(inspector -> checkLambdaCount(inspector, 3, "lambdadesugaringnplus"))
.run();
}
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 82c6918..f18a09f 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -1713,22 +1713,4 @@
.compile()
.writeToZip();
}
-
- public static <E extends Throwable> void assertThrowsWithHorizontalClassMerging(
- ThrowingAction<E> action) throws E {
- try {
- action.execute();
- if (isHorizontalClassMergingEnabled()) {
- fail();
- }
- } catch (Throwable throwable) {
- if (!isHorizontalClassMergingEnabled()) {
- throw throwable;
- }
- }
- }
-
- public static boolean isHorizontalClassMergingEnabled() {
- return System.getProperty("com.android.tools.r8.horizontalClassMerging") != null;
- }
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 143f206..807b061 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -131,35 +131,32 @@
@Before
public void generateR8Version() throws Exception {
- assertThrowsWithHorizontalClassMerging(
- () -> {
- outputDir = temp.newFolder().toPath();
- Path mapFile = outputDir.resolve(DEFAULT_MAP_FILENAME);
- generateR8Version(outputDir, mapFile, true);
- String output;
- if (parameters.isDexRuntime()) {
- output =
- ToolHelper.runArtNoVerificationErrors(
- Collections.singletonList(outputDir.resolve(DEFAULT_DEX_FILENAME).toString()),
- "inlining.Inlining",
- builder -> {},
- parameters.getRuntime().asDex().getVm());
- } else {
- assert parameters.isCfRuntime();
- output =
- ToolHelper.runJava(
- parameters.getRuntime().asCf(),
- Collections.singletonList("-noverify"),
- Collections.singletonList(outputDir),
- "inlining.Inlining")
- .stdout;
- }
+ outputDir = temp.newFolder().toPath();
+ Path mapFile = outputDir.resolve(DEFAULT_MAP_FILENAME);
+ generateR8Version(outputDir, mapFile, true);
+ String output;
+ if (parameters.isDexRuntime()) {
+ output =
+ ToolHelper.runArtNoVerificationErrors(
+ Collections.singletonList(outputDir.resolve(DEFAULT_DEX_FILENAME).toString()),
+ "inlining.Inlining",
+ builder -> {},
+ parameters.getRuntime().asDex().getVm());
+ } else {
+ assert parameters.isCfRuntime();
+ output =
+ ToolHelper.runJava(
+ parameters.getRuntime().asCf(),
+ Collections.singletonList("-noverify"),
+ Collections.singletonList(outputDir),
+ "inlining.Inlining")
+ .stdout;
+ }
- // Compare result with Java to make sure we have the same behavior.
- ProcessResult javaResult = ToolHelper.runJava(getInputFile(), "inlining.Inlining");
- assertEquals(0, javaResult.exitCode);
- assertEquals(javaResult.stdout, output);
- });
+ // Compare result with Java to make sure we have the same behavior.
+ ProcessResult javaResult = ToolHelper.runJava(getInputFile(), "inlining.Inlining");
+ assertEquals(0, javaResult.exitCode);
+ assertEquals(javaResult.stdout, output);
}
private void checkAbsentBooleanMethod(ClassSubject clazz, String name) {
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithSuperCallTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithSuperCallTest.java
index 4c48e80..640fd85 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithSuperCallTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithSuperCallTest.java
@@ -15,19 +15,15 @@
@RunWith(Parameterized.class)
public class AssumenosideeffectsPropagationWithSuperCallTest extends TestBase {
private static final Class<?> MAIN = DelegatesUser.class;
- private static final String JVM_OUTPUT =
+ private static final String EXPECTED_OUTPUT =
StringUtils.lines("[Base] message1", "[Base] message2", "The end");
// With horizontal class merging enabled the method body for debug is cleared, because the
// forwarded call to the class specific implementation has no side effects. The call to the
// function from main persists.
- private static final String JVM_OUTPUT_HOR_MERGING =
+ private static final String EXPECTED_OUTPUT_WITH_HORIZONTAL_CLASS_MERGING =
StringUtils.lines("[Base] message2", "The end");
- private static final String OUTPUT_WITHOUT_MESSAGES = StringUtils.lines(
- "The end"
- );
-
enum TestConfig {
SPECIFIC_RULES,
NON_SPECIFIC_RULES_WITH_EXTENDS;
@@ -51,11 +47,13 @@
}
}
- public String expectedOutput() {
+ public String expectedOutput(TestParameters parameters) {
switch (this) {
case SPECIFIC_RULES:
case NON_SPECIFIC_RULES_WITH_EXTENDS:
- return isHorizontalClassMergingEnabled() ? JVM_OUTPUT_HOR_MERGING : JVM_OUTPUT;
+ return parameters.isCfRuntime()
+ ? EXPECTED_OUTPUT
+ : EXPECTED_OUTPUT_WITH_HORIZONTAL_CLASS_MERGING;
default:
throw new Unreachable();
}
@@ -67,7 +65,8 @@
@Parameterized.Parameters(name = "{0} {1}")
public static Collection<Object[]> data() {
- return buildParameters(getTestParameters().withAllRuntimes().build(), TestConfig.values());
+ return buildParameters(
+ getTestParameters().withAllRuntimesAndApiLevels().build(), TestConfig.values());
}
public AssumenosideeffectsPropagationWithSuperCallTest(
@@ -83,9 +82,9 @@
.addKeepMainRule(MAIN)
.addKeepRules(config.getKeepRules())
.noMinification()
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), MAIN)
- .assertSuccessWithOutput(config.expectedOutput());
+ .assertSuccessWithOutput(config.expectedOutput(parameters));
}
static class BaseClass {