Simplify horizontal class merging options logic

Currently, the class merger is configured when setting up the D8Command,
L8Command and R8Command.

This CL simplifies the logic by removing all configuration of the
horizontal class merger in D8Command, L8Command and R8Command, and
instead moving the decision making into HorizontalClassMergerOptions.

Change-Id: Ia895be9e180cdc039281c734d9fc774254d62f5f
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 71eab03..2c2aed6 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -37,7 +37,6 @@
 import com.android.tools.r8.utils.InternalGlobalSyntheticsProgramProvider;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.InternalOptions.DesugarState;
-import com.android.tools.r8.utils.InternalOptions.HorizontalClassMergerOptions;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
 import com.android.tools.r8.utils.InternalOptions.MappingComposeOptions;
 import com.android.tools.r8.utils.ProgramClassCollection;
@@ -907,15 +906,6 @@
     // Disable global optimizations.
     internal.disableGlobalOptimizations();
 
-    HorizontalClassMergerOptions horizontalClassMergerOptions =
-        internal.horizontalClassMergerOptions();
-    if (internal.isGeneratingDex()) {
-      horizontalClassMergerOptions.setRestrictToSynthetics();
-    } else {
-      assert internal.isGeneratingClassFiles();
-      horizontalClassMergerOptions.disable();
-    }
-
     internal.configureAndroidPlatformBuild(getAndroidPlatformBuild());
 
     internal.getArtProfileOptions().setArtProfilesForRewriting(getArtProfilesForRewriting());
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 5fca27d..ebe7388 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -201,8 +201,6 @@
     assert !internal.outline.enabled;
     assert !internal.enableTreeShakingOfLibraryMethodOverrides;
 
-    internal.horizontalClassMergerOptions().disable();
-
     assert internal.desugarState == DesugarState.ON;
     assert internal.enableInheritanceClassInDexDistributor;
     internal.enableInheritanceClassInDexDistributor = false;
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d81f53d..376be97 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -583,7 +583,7 @@
             }
           }
 
-          if (options.isClassMergingExtensionRequired()) {
+          if (options.isClassMergingExtensionRequired(appView)) {
             finalRuntimeTypeCheckInfoBuilder = new RuntimeTypeCheckInfo.Builder(appView);
           }
           Enqueuer enqueuer =
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 22a23de..a1229c9 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -56,7 +56,6 @@
 import com.android.tools.r8.utils.ExceptionDiagnostic;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.InternalOptions.DesugarState;
-import com.android.tools.r8.utils.InternalOptions.HorizontalClassMergerOptions;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
 import com.android.tools.r8.utils.InternalOptions.MappingComposeOptions;
 import com.android.tools.r8.utils.InternalProgramClassProvider;
@@ -1480,10 +1479,6 @@
     MappingComposeOptions mappingComposeOptions = internal.mappingComposeOptions();
     mappingComposeOptions.enableExperimentalMappingComposition = true;
 
-    HorizontalClassMergerOptions horizontalClassMergerOptions =
-        internal.horizontalClassMergerOptions();
-    assert internal.isOptimizing() || horizontalClassMergerOptions.isRestrictedToSynthetics();
-
     assert !internal.enableTreeShakingOfLibraryMethodOverrides;
 
     if (!internal.isShrinking()) {
@@ -1566,9 +1561,6 @@
     //  careful when merging a public member 'm' from a class A into another class B, since B could
     //  have a kept subclass, in which case 'm' would leak into the public API.
     if (internal.isGeneratingClassFiles()) {
-      if (System.getProperty("com.android.tools.r8.disableHorizontalClassMerging") == null) {
-        horizontalClassMergerOptions.disable();
-      }
       // R8 CF output does not support desugaring so disable it.
       internal.desugarState = DesugarState.OFF;
       // TODO(b/333477035): Since D8 dexing now supports outline/stubbing API calls R8/CF should
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
index 63b26c4..5e7d534 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
@@ -40,7 +40,7 @@
       return new ClassInstanceFieldsMergerImpl(appView.withClassHierarchy(), lensBuilder, group);
     } else {
       assert group.getInstanceFieldMap().isEmpty();
-      assert appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics();
+      assert appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics(appView);
       return new ClassInstanceFieldsMerger() {
         @Override
         public void setClassIdField(DexEncodedField classIdField) {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
index 9603933..6f4ce43 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
@@ -55,7 +55,7 @@
   }
 
   public static HorizontalClassMerger createForD8ClassMerging(AppView<?> appView) {
-    assert appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics();
+    assert appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics(appView);
     return new HorizontalClassMerger(appView);
   }
 
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
index 80af5cd..461cd61 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMergerCollection.java
@@ -44,7 +44,7 @@
       HorizontalMergeGroup group,
       HorizontalClassMergerGraphLens.Builder lensBuilder) {
     if (!appView.hasClassHierarchy()) {
-      assert appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics();
+      assert appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics(appView);
       assert verifyNoInstanceInitializers(group);
       return new InstanceInitializerMergerCollection(
           Collections.emptyList(), Collections.emptyMap());
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 0f1355f..8751b15 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
@@ -114,7 +114,7 @@
 
     addRequiredSingleClassPolicies(appView, immediateSubtypingInfo, builder);
 
-    if (appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics()) {
+    if (appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics(appView)) {
       assert verifySingleClassPoliciesIrrelevantForMergingSynthetics(appView, builder);
     } else {
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
@@ -215,7 +215,7 @@
       RuntimeTypeCheckInfo runtimeTypeCheckInfo) {
     ImmutableList.Builder<Policy> builder = ImmutableList.builder();
     addRequiredMultiClassPolicies(appView, runtimeTypeCheckInfo, builder);
-    if (!appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics()) {
+    if (!appView.options().horizontalClassMergerOptions().isRestrictedToSynthetics(appView)) {
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
       addMultiClassPoliciesForMergingNonSyntheticClasses(appViewWithLiveness, builder);
     }
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckSyntheticClasses.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckSyntheticClasses.java
index c9c3569..58753b8 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckSyntheticClasses.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/CheckSyntheticClasses.java
@@ -12,10 +12,12 @@
 
 public class CheckSyntheticClasses extends SingleClassPolicy {
 
+  private final AppView<?> appView;
   private final HorizontalClassMergerOptions options;
   private final SyntheticItems syntheticItems;
 
   public CheckSyntheticClasses(AppView<?> appView) {
+    this.appView = appView;
     this.options = appView.options().horizontalClassMergerOptions();
     this.syntheticItems = appView.getSyntheticItems();
   }
@@ -25,7 +27,7 @@
     if (!options.isSyntheticMergingEnabled() && syntheticItems.isSyntheticClass(clazz)) {
       return false;
     }
-    if (options.isRestrictedToSynthetics()
+    if (options.isRestrictedToSynthetics(appView)
         && !syntheticItems.isSyntheticClassEligibleForMerging(clazz)) {
       return false;
     }
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 7a1769d..942220a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -115,6 +115,7 @@
 import com.android.tools.r8.utils.internal.AssertionUtils;
 import com.android.tools.r8.utils.internal.ConsumerUtils;
 import com.android.tools.r8.utils.internal.ListUtils;
+import com.android.tools.r8.utils.internal.OptionalBool;
 import com.android.tools.r8.utils.internal.QuadConsumer;
 import com.android.tools.r8.utils.internal.SetUtils;
 import com.android.tools.r8.utils.internal.StringUtils;
@@ -383,7 +384,6 @@
     enableTreeShakingOfLibraryMethodOverrides = false;
     enableInitializedClassesAnalysis = false;
     callSiteOptimizationOptions.disableOptimization();
-    horizontalClassMergerOptions.setRestrictToSynthetics();
     verticalClassMergerOptions.disable();
   }
 
@@ -1059,10 +1059,10 @@
    * If any non-static class merging is enabled, information about types referred to by instanceOf
    * and check cast instructions needs to be collected.
    */
-  public boolean isClassMergingExtensionRequired() {
+  public boolean isClassMergingExtensionRequired(AppView<?> appView) {
     WholeProgramOptimizations wholeProgramOptimizations = WholeProgramOptimizations.ON;
     return horizontalClassMergerOptions.isEnabled(wholeProgramOptimizations)
-        && !horizontalClassMergerOptions.isRestrictedToSynthetics();
+        && !horizontalClassMergerOptions.isRestrictedToSynthetics(appView);
   }
 
   @Override
@@ -2040,9 +2040,9 @@
 
   public class HorizontalClassMergerOptions {
 
-    private boolean enable =
-        !SystemPropertyUtils.parseSystemPropertyOrDefault(
-            "com.android.tools.r8.disableHorizontalClassMerging", false);
+    private OptionalBool disable =
+        SystemPropertyUtils.parseSystemPropertyOrDefault(
+            "com.android.tools.r8.disableHorizontalClassMerging", OptionalBool.UNKNOWN);
     private boolean enableClassInitializerDeadlockDetection = true;
     private boolean enableInterfaceMerging =
         SystemPropertyUtils.parseSystemPropertyOrDefault(
@@ -2051,24 +2051,20 @@
         SystemPropertyUtils.parseSystemPropertyOrDefault(
             "com.android.tools.r8.enableSameFilePolicy", false);
     private boolean enableSyntheticMerging = true;
-    private boolean restrictToSynthetics = false;
 
-    public void disable() {
-      enable = false;
+    // Used in tests to enable horizontal class merging when compiling to class files.
+    public void enableForTesting() {
+      disable = OptionalBool.FALSE;
     }
 
-    public void disableSyntheticMerging() {
+    public void disableForTesting() {
+      disable = OptionalBool.TRUE;
+    }
+
+    public void disableSyntheticMergingForTesting() {
       enableSyntheticMerging = false;
     }
 
-    public void enable() {
-      enable = true;
-    }
-
-    public void enableIf(boolean enable) {
-      this.enable = enable;
-    }
-
     public int getMaxClassGroupSizeInR8() {
       return 30;
     }
@@ -2086,7 +2082,12 @@
     }
 
     public boolean isEnabled(WholeProgramOptimizations wholeProgramOptimizations) {
-      if (!enable || debug || intermediate) {
+      if (disable.isTrue() || debug || intermediate) {
+        return false;
+      }
+      // Disable horizontal class merging when compiling to class files, unless it has been
+      // explicitly enabled or disabled.
+      if (isGeneratingClassFiles() && disable.isUnknown()) {
         return false;
       }
       if (wholeProgramOptimizations.isOn()) {
@@ -2109,8 +2110,8 @@
       return enableInterfaceMerging;
     }
 
-    public boolean isRestrictedToSynthetics() {
-      return restrictToSynthetics || !isOptimizing() || !isShrinking();
+    public boolean isRestrictedToSynthetics(AppView<?> appView) {
+      return !appView.enableWholeProgramOptimizations() || !isOptimizing() || !isShrinking();
     }
 
     public void setEnableClassInitializerDeadlockDetection() {
@@ -2128,10 +2129,6 @@
     public void setEnableSameFilePolicy(boolean enableSameFilePolicy) {
       this.enableSameFilePolicy = enableSameFilePolicy;
     }
-
-    public void setRestrictToSynthetics() {
-      restrictToSynthetics = true;
-    }
   }
 
   public static class OpenClosedInterfacesOptions {
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithClInitOnCCTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithClInitOnCCTest.java
index ba3a7bd..b3e7208 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithClInitOnCCTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithClInitOnCCTest.java
@@ -31,11 +31,6 @@
         .addInnerClasses(getClass())
         .setMode(CompilationMode.RELEASE)
         .setMinApi(parameters)
-        .addOptionsModification(
-            options -> {
-              options.horizontalClassMergerOptions().enable();
-              options.horizontalClassMergerOptions().setRestrictToSynthetics();
-            })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("0", "1");
   }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithCompanionClassesTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithCompanionClassesTest.java
index 7a8d50c..29e7abe 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithCompanionClassesTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingInD8WithCompanionClassesTest.java
@@ -46,11 +46,6 @@
         .addInnerClasses(getClass())
         .setMode(CompilationMode.RELEASE)
         .setMinApi(parameters)
-        .addOptionsModification(
-            options -> {
-              options.horizontalClassMergerOptions().enable();
-              options.horizontalClassMergerOptions().setRestrictToSynthetics();
-            })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("I::foo", "J::bar")
         .inspect(
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingOfInitArgumentTypesTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingOfInitArgumentTypesTest.java
index 2212c6b..ce77962 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingOfInitArgumentTypesTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingOfInitArgumentTypesTest.java
@@ -47,7 +47,9 @@
                   options
                       .callSiteOptimizationOptions()
                       .setForceSyntheticsForInstanceInitializers(true);
-                  options.horizontalClassMergerOptions().enableIf(enableHorizontalClassMerging);
+                  if (!enableHorizontalClassMerging) {
+                    options.horizontalClassMergerOptions().disableForTesting();
+                  }
                 })
             .collectSyntheticItems()
             .enableInliningAnnotations()
diff --git a/src/test/java/com/android/tools/r8/compose/UnusedComposeLambdaTest.java b/src/test/java/com/android/tools/r8/compose/UnusedComposeLambdaTest.java
index 302d457..fd0e5e1 100644
--- a/src/test/java/com/android/tools/r8/compose/UnusedComposeLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/compose/UnusedComposeLambdaTest.java
@@ -31,7 +31,8 @@
   public void testR8() throws Exception {
     testForR8(parameters)
         .addInnerClasses(getClass())
-        .addOptionsModification(options -> options.horizontalClassMergerOptions().disable())
+        .addOptionsModification(
+            options -> options.horizontalClassMergerOptions().disableForTesting())
         .addKeepMainRule(TestClass.class)
         .compile()
         .inspect(
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureEnclosingTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureEnclosingTest.java
index 58b3c0b..822876d 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureEnclosingTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureEnclosingTest.java
@@ -14,9 +14,9 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.graph.genericsignature.GenericSignatureEnclosingTest.Bar.Inner;
 import com.android.tools.r8.graph.genericsignature.GenericSignatureEnclosingTest.Bar.SubInner;
-import com.android.tools.r8.utils.internal.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.internal.BooleanUtils;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -52,7 +52,7 @@
         .setMinApi(parameters)
         .addOptionsModification(
             options -> {
-              options.horizontalClassMergerOptions().disable();
+              options.horizontalClassMergerOptions().disableForTesting();
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterRecursiveTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterRecursiveTest.java
index 109278b..0e49704 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterRecursiveTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterRecursiveTest.java
@@ -10,9 +10,9 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.internal.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.internal.BooleanUtils;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,7 +45,8 @@
         .addKeepAttributeSignature()
         .addKeepAttributeInnerClassesAndEnclosingMethod()
         .setMinApi(parameters)
-        .addOptionsModification(options -> options.horizontalClassMergerOptions().disable())
+        .addOptionsModification(
+            options -> options.horizontalClassMergerOptions().disableForTesting())
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Bar::enclosingMethod")
         .inspect(this::checkSignatures);
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
index 964c833..3728350 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedOuterTest.java
@@ -10,9 +10,9 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.internal.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.internal.BooleanUtils;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,7 +45,8 @@
         .addKeepAttributeSignature()
         .addKeepAttributeInnerClassesAndEnclosingMethod()
         .setMinApi(parameters)
-        .addOptionsModification(options -> options.horizontalClassMergerOptions().disable())
+        .addOptionsModification(
+            options -> options.horizontalClassMergerOptions().disableForTesting())
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(
             "Bar::enclosingMethod", "Hello World", "Bar::enclosingMethod2", "Hello World")
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java
index 9ea32b6..1c42658 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java
@@ -76,7 +76,7 @@
   private void clearClassMerging(TestShrinkerBuilder<?, ?, ?, ?, ?> sb) {
     sb.addOptionsModification(
         opt -> {
-          opt.horizontalClassMergerOptions().disable();
+          opt.horizontalClassMergerOptions().disableForTesting();
           opt.getVerticalClassMergerOptions().disable();
         });
   }
diff --git a/src/test/java8/shaking/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java b/src/test/java8/shaking/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java
index 5e85041..e0d8781 100644
--- a/src/test/java8/shaking/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java
+++ b/src/test/java8/shaking/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java
@@ -152,8 +152,11 @@
         .addKeepMainRule(MAIN)
         .addKeepRules(config.getKeepRules())
         .addOptionsModification(
-            options ->
-                options.horizontalClassMergerOptions().enableIf(enableHorizontalClassMerging))
+            options -> {
+              if (!enableHorizontalClassMerging) {
+                options.horizontalClassMergerOptions().disableForTesting();
+              }
+            })
         .enableInliningAnnotations()
         .addDontObfuscate()
         .setMinApi(parameters)
diff --git a/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
index 2000829..518a1f7 100644
--- a/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/D8TestBuilder.java
@@ -194,7 +194,7 @@
 
   public D8TestBuilder noHorizontalClassMergingOfSynthetics() {
     return addOptionsModification(
-        options -> options.horizontalClassMergerOptions().disableSyntheticMerging());
+        options -> options.horizontalClassMergerOptions().disableSyntheticMergingForTesting());
   }
 
   public D8TestBuilder collectBuildMetadata() {
diff --git a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
index fc1aaad..d9fd929 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
@@ -638,7 +638,7 @@
 
   public T noHorizontalClassMergingOfSynthetics() {
     return addOptionsModification(
-        options -> options.horizontalClassMergerOptions().disableSyntheticMerging());
+        options -> options.horizontalClassMergerOptions().disableSyntheticMergingForTesting());
   }
 
   public T noInliningOfSynthetics() {
diff --git a/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
index 6390c7a..6ff2f41 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -90,7 +90,7 @@
             options.testing.enableRepackagingByDefault = true;
             options.testing.enableRepackagingByDefaultForCf = true;
             options.testing.forcePruneMetaInfManifestMf = true;
-            options.horizontalClassMergerOptions().enable();
+            options.horizontalClassMergerOptions().enableForTesting();
             options.horizontalClassMergerOptions().setEnableInterfaceMerging();
             options
                 .getCfCodeAnalysisOptions()