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 {