Reland "Keep debug related information in R8 debug mode."

Bug: 202486757
Change-Id: I51c59204c15a9c8c680d0c1c28e2f4e31456759c
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index bb22da1..c9ffe03 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -528,6 +528,11 @@
                 }
               });
 
+      if (getMode() == CompilationMode.DEBUG) {
+        disableMinification = true;
+        configurationBuilder.disableOptimization();
+      }
+
       if (disableTreeShaking) {
         configurationBuilder.disableShrinking();
       }
@@ -823,10 +828,8 @@
 
   @Override
   InternalOptions getInternalOptions() {
-    InternalOptions internal = new InternalOptions(proguardConfiguration, getReporter());
+    InternalOptions internal = new InternalOptions(getMode(), proguardConfiguration, getReporter());
     assert !internal.testing.allowOutlinerInterfaceArrayArguments;  // Only allow in tests.
-    assert !internal.debug;
-    internal.debug = getMode() == CompilationMode.DEBUG;
     internal.programConsumer = getProgramConsumer();
     internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
     internal.desugarState = getDesugarState();
@@ -835,40 +838,26 @@
     assert !internal.ignoreMissingClasses;
     internal.ignoreMissingClasses =
         proguardConfiguration.isIgnoreWarnings()
-            // TODO(70706667): We probably only want this in Proguard compatibility mode.
             || (forceProguardCompatibility
-                && !proguardConfiguration.isOptimizing()
+                && !internal.isOptimizing()
                 && !internal.isShrinking()
                 && !internal.isMinifying());
 
     assert !internal.verbose;
     internal.mainDexKeepRules = mainDexKeepRules;
-    internal.minimalMainDex = getMode() == CompilationMode.DEBUG;
+    internal.minimalMainDex = internal.debug;
     internal.mainDexListConsumer = getMainDexListConsumer();
     internal.lineNumberOptimization =
-        !internal.debug && (proguardConfiguration.isOptimizing() || internal.isMinifying())
+        (internal.isOptimizing() || internal.isMinifying())
             ? LineNumberOptimization.ON
             : LineNumberOptimization.OFF;
 
     HorizontalClassMergerOptions horizontalClassMergerOptions =
         internal.horizontalClassMergerOptions();
-    assert proguardConfiguration.isOptimizing()
-        || horizontalClassMergerOptions.isRestrictedToSynthetics();
+    assert internal.isOptimizing() || horizontalClassMergerOptions.isRestrictedToSynthetics();
 
     assert !internal.enableTreeShakingOfLibraryMethodOverrides;
-    assert internal.enableVerticalClassMerging || !proguardConfiguration.isOptimizing();
-    if (internal.debug) {
-      internal.getProguardConfiguration().getKeepAttributes().lineNumberTable = true;
-      internal.getProguardConfiguration().getKeepAttributes().localVariableTable = true;
-      internal.getProguardConfiguration().getKeepAttributes().localVariableTypeTable = true;
-      internal.enableInlining = false;
-      internal.enableClassInlining = false;
-      internal.enableVerticalClassMerging = false;
-      internal.enableClassStaticizer = false;
-      internal.outline.enabled = false;
-      internal.enableEnumUnboxing = false;
-      internal.callSiteOptimizationOptions().disableOptimization();
-    }
+    assert internal.enableVerticalClassMerging || !internal.isOptimizing();
 
     if (!internal.isShrinking()) {
       // If R8 is not shrinking, there is no point in running various optimizations since the
diff --git a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
index aea3e82..7c7e1d4 100644
--- a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
+++ b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer;
 import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.Keep;
@@ -144,7 +145,12 @@
     // We are using the proguard configuration for adapting resources.
     InternalOptions options =
         new InternalOptions(
+            // Set debug to ensure that we are writing all information to the application writer.
+            CompilationMode.DEBUG,
             ProguardConfiguration.builder(factory, getReporter())
+                .disableShrinking()
+                .disableObfuscation()
+                .disableOptimization()
                 .addKeepAttributePatterns(ImmutableList.of("*"))
                 .addAdaptResourceFilenames(ProguardPathList.builder().addFileName("**").build())
                 .build(),
@@ -154,8 +160,6 @@
     options.programConsumer = consumer;
     assert consumer != null;
     options.dataResourceConsumer = consumer.getDataResourceConsumer();
-    // Set debug to ensure that we are writing all information to the application writer.
-    options.debug = true;
     return options;
   }
 
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 bf36717..634b988 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -179,25 +179,41 @@
   }
 
   // Constructor for R8.
-  public InternalOptions(ProguardConfiguration proguardConfiguration, Reporter reporter) {
+  public InternalOptions(
+      CompilationMode mode, ProguardConfiguration proguardConfiguration, Reporter reporter) {
     assert reporter != null;
     assert proguardConfiguration != null;
+    this.debug = mode == CompilationMode.DEBUG;
     this.reporter = reporter;
     this.proguardConfiguration = proguardConfiguration;
     itemFactory = proguardConfiguration.getDexItemFactory();
     enableTreeShaking = proguardConfiguration.isShrinking();
     enableMinification = proguardConfiguration.isObfuscating();
-    // TODO(b/171457102): Avoid the need for this.
-    // -dontoptimize disables optimizations by flipping related flags.
     if (!proguardConfiguration.isOptimizing()) {
+      // TODO(b/171457102): Avoid the need for this.
+      // -dontoptimize disables optimizations by flipping related flags.
       disableAllOptimizations();
     }
+    if (debug) {
+      assert !isMinifying();
+      assert !isOptimizing();
+      keepDebugRelatedInformation();
+    }
     configurationDebugging = proguardConfiguration.isConfigurationDebugging();
     if (proguardConfiguration.isProtoShrinkingEnabled()) {
       enableProtoShrinking();
     }
   }
 
+  private void keepDebugRelatedInformation() {
+    assert !proguardConfiguration.isObfuscating();
+    getProguardConfiguration().getKeepAttributes().sourceFile = true;
+    getProguardConfiguration().getKeepAttributes().sourceDebugExtension = true;
+    getProguardConfiguration().getKeepAttributes().lineNumberTable = true;
+    getProguardConfiguration().getKeepAttributes().localVariableTable = true;
+    getProguardConfiguration().getKeepAttributes().localVariableTypeTable = true;
+  }
+
   void enableProtoShrinking() {
     applyInliningToInlinee = true;
     enableFieldBitAccessAnalysis = true;
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 44ab3fc..7a70c5a 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -621,7 +621,8 @@
       DexString renamedName = namingLens.lookupName(method);
       if (renamedName != method.name
           || graphLens.getOriginalMethodSignature(method) != method
-          || doesContainPositions(encodedMethod)) {
+          || doesContainPositions(encodedMethod)
+          || encodedMethod.isD8R8Synthesized()) {
         methodsByRenamedName
             .computeIfAbsent(renamedName, key -> new ArrayList<>())
             .add(encodedMethod);
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index e3c86ad..21113a9 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -766,7 +766,9 @@
             return builder.build();
           };
     }
-    InternalOptions options = new InternalOptions(keepConfig.apply(dexItemFactory), new Reporter());
+    InternalOptions options =
+        new InternalOptions(
+            CompilationMode.RELEASE, keepConfig.apply(dexItemFactory), new Reporter());
     if (optionsConsumer != null) {
       optionsConsumer.accept(options);
     }
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
index dbaa9c9..be7b225 100644
--- a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -352,6 +352,10 @@
     return addKeepAttributes(ProguardKeepAttributes.LINE_NUMBER_TABLE);
   }
 
+  public T addKeepAttributeLocalVariableTable() {
+    return addKeepAttributes(ProguardKeepAttributes.LOCAL_VARIABLE_TABLE);
+  }
+
   public T addKeepAttributeSignature() {
     return addKeepAttributes(ProguardKeepAttributes.SIGNATURE);
   }
diff --git a/src/test/java/com/android/tools/r8/debug/MinificationTest.java b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
deleted file mode 100644
index b42d7fa..0000000
--- a/src/test/java/com/android/tools/r8/debug/MinificationTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.debug;
-
-import static org.junit.Assert.assertTrue;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.debug.DebugTestConfig.RuntimeKind;
-import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-/** Tests renaming of class and method names and corresponding proguard map output. */
-@RunWith(Parameterized.class)
-public class MinificationTest extends DebugTestBase {
-
-  private static final String SOURCE_FILE = "Minified.java";
-
-  @Parameterized.Parameters(name = "backend:{0} minification:{1} proguardMap:{2}")
-  public static Collection minificationControl() {
-    ImmutableList.Builder<Object> builder = ImmutableList.builder();
-    for (RuntimeKind kind : RuntimeKind.values()) {
-      for (MinifyMode mode : MinifyMode.values()) {
-        builder.add((Object) new Object[] {kind, mode, false});
-        if (mode.isMinify()) {
-          builder.add((Object) new Object[] {kind, mode, true});
-        }
-      }
-    }
-    return builder.build();
-  }
-
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  private final RuntimeKind runtimeKind;
-  private final MinifyMode minificationMode;
-  private final boolean writeProguardMap;
-
-  public MinificationTest(
-      RuntimeKind runtimeKind, MinifyMode minificationMode, boolean writeProguardMap) {
-    this.runtimeKind = runtimeKind;
-    this.minificationMode = minificationMode;
-    this.writeProguardMap = writeProguardMap;
-  }
-
-  private boolean minifiedNames() {
-    return minificationMode.isMinify() && !writeProguardMap;
-  }
-
-  private DebugTestConfig getTestConfig() throws Throwable {
-    List<String> proguardConfigurations = Collections.emptyList();
-    ImmutableList.Builder<String> proguardConfigurationBuilder = ImmutableList.builder();
-    if (!minificationMode.isMinify()) {
-      proguardConfigurationBuilder.add("-dontobfuscate");
-    } else if (minificationMode.isAggressive()) {
-      proguardConfigurationBuilder.add("-overloadaggressively");
-    }
-    proguardConfigurationBuilder.add(
-        "-keep public class Minified { public static void main(java.lang.String[]); }");
-    proguardConfigurationBuilder.add("-keepattributes SourceFile");
-    proguardConfigurationBuilder.add("-keepattributes LineNumberTable");
-    proguardConfigurations = proguardConfigurationBuilder.build();
-
-    Path outputPath = temp.getRoot().toPath().resolve("classes.zip");
-    Path proguardMap = writeProguardMap ? temp.getRoot().toPath().resolve("proguard.map") : null;
-    OutputMode outputMode =
-        runtimeKind == RuntimeKind.CF ? OutputMode.ClassFile : OutputMode.DexIndexed;
-    R8Command.Builder builder =
-        R8Command.builder()
-            .addProgramFiles(DEBUGGEE_JAR)
-            .setOutput(outputPath, outputMode)
-            .setMode(CompilationMode.DEBUG);
-    if (runtimeKind == RuntimeKind.DEX) {
-      AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
-      builder.setMinApiLevel(minSdk.getLevel()).addLibraryFiles(ToolHelper.getAndroidJar(minSdk));
-    } else if (runtimeKind == RuntimeKind.CF) {
-      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
-    }
-    if (proguardMap != null) {
-      builder.setProguardMapOutputPath(proguardMap);
-    }
-    if (!proguardConfigurations.isEmpty()) {
-      builder.addProguardConfiguration(proguardConfigurations, Origin.unknown());
-    }
-    // Disable line number optimization if we're not using a Proguard map.
-    ToolHelper.runR8(
-        builder.build(),
-        proguardMap == null
-            ? (oc -> oc.lineNumberOptimization = LineNumberOptimization.OFF)
-            : null);
-
-    switch (runtimeKind) {
-      case CF:
-        {
-          CfDebugTestConfig config = new CfDebugTestConfig(outputPath);
-          config.setProguardMap(proguardMap);
-          return config;
-        }
-      case DEX:
-        {
-          DexDebugTestConfig config = new DexDebugTestConfig(outputPath);
-          config.setProguardMap(proguardMap);
-          return config;
-        }
-      default:
-        throw new Unreachable();
-    }
-  }
-
-  @Test
-  public void testBreakInMainClass() throws Throwable {
-    final String className = "Minified";
-    final String methodName = minifiedNames() ? "a" : "test";
-    final String signature = "()V";
-    final String innerClassName = minifiedNames() ? "a" : "Minified$Inner";
-    final String innerMethodName = minifiedNames() ? "a" : "innerTest";
-    final String innerSignature = "()I";
-    DebugTestConfig config = getTestConfig();
-    checkStructure(
-        config,
-        className,
-        MethodSignature.fromSignature(methodName, signature),
-        innerClassName,
-        MethodSignature.fromSignature(innerMethodName, innerSignature));
-    runDebugTest(
-        config,
-        className,
-        breakpoint(className, methodName, signature),
-        run(),
-        checkMethod(className, methodName, signature),
-        checkLine(SOURCE_FILE, 14),
-        stepOver(INTELLIJ_FILTER),
-        checkMethod(className, methodName, signature),
-        checkLine(SOURCE_FILE, 15),
-        stepInto(INTELLIJ_FILTER),
-        checkMethod(innerClassName, innerMethodName, innerSignature),
-        checkLine(8),
-        run());
-  }
-
-  @Test
-  public void testBreakInPossiblyRenamedClass() throws Throwable {
-    final String className = "Minified";
-    final String innerClassName = minifiedNames() ? "a" : "Minified$Inner";
-    final String innerMethodName = minifiedNames() ? "a" : "innerTest";
-    final String innerSignature = "()I";
-    DebugTestConfig config = getTestConfig();
-    checkStructure(
-        config,
-        className,
-        innerClassName,
-        MethodSignature.fromSignature(innerMethodName, innerSignature));
-    runDebugTest(
-        config,
-        className,
-        breakpoint(innerClassName, innerMethodName, innerSignature),
-        run(),
-        checkMethod(innerClassName, innerMethodName, innerSignature),
-        checkLine(8),
-        run());
-  }
-
-  private void checkStructure(
-      DebugTestConfig config,
-      String className,
-      MethodSignature method,
-      String innerClassName,
-      MethodSignature innerMethod)
-      throws Throwable {
-    Path proguardMap = config.getProguardMap();
-    String mappingFile = proguardMap == null ? null : proguardMap.toString();
-    CodeInspector inspector = new CodeInspector(config.getPaths(), mappingFile, null);
-    ClassSubject clazz = inspector.clazz(className);
-    assertTrue(clazz.isPresent());
-    if (method != null) {
-      assertTrue(clazz.method(method).isPresent());
-    }
-    ClassSubject innerClass = inspector.clazz(innerClassName);
-    assertTrue(innerClass.isPresent());
-    assertTrue(innerClass.method(innerMethod).isPresent());
-  }
-
-  private void checkStructure(
-      DebugTestConfig config, String className, String innerClassName, MethodSignature innerMethod)
-      throws Throwable {
-    checkStructure(config, className, null, innerClassName, innerMethod);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index 909a929..6f5d826 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.ToolHelper.getMostRecentAndroidJar;
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -93,7 +94,8 @@
     Reporter reporter = new Reporter();
     ProguardConfiguration proguardConfiguration =
         ProguardConfiguration.builder(new DexItemFactory(), reporter).build();
-    InternalOptions options = new InternalOptions(proguardConfiguration, reporter);
+    InternalOptions options =
+        new InternalOptions(CompilationMode.RELEASE, proguardConfiguration, reporter);
     options.programConsumer = DexIndexedConsumer.emptyConsumer();
     return options;
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
index be426b1..2b6a5c8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
@@ -8,32 +8,45 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.debug.DebugTestBase;
 import com.android.tools.r8.debug.DebugTestConfig;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Streams;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class InterfaceRenewalInLoopDebugTestRunner extends DebugTestBase {
   private static Class<?> MAIN = InterfaceRenewalInLoopDebugTest.class;
+  private static Class<?> ITF = TestInterface.class;
   private static Class<?> IMPL = OneUniqueImplementer.class;
 
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withSystemRuntime().build();
+  }
+
+  private final TestParameters parameters;
+
+  public InterfaceRenewalInLoopDebugTestRunner(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
   @Test
   public void test() throws Throwable {
     R8TestCompileResult result =
-        testForR8(Backend.CF)
-            .setMode(CompilationMode.DEBUG)
-            .addProgramClasses(TestInterface.class, IMPL, MAIN)
+        testForR8(parameters.getBackend())
+            .debug()
+            .addProgramClasses(ITF, IMPL, MAIN)
             .addKeepMainRule(MAIN)
-            .addKeepRules(ImmutableList.of("-keepattributes SourceFile,LineNumberTable"))
             .enableNoVerticalClassMergingAnnotations()
-            .noMinification()
             .compile();
 
     CodeInspector inspector = result.inspector();
@@ -41,7 +54,7 @@
     assertThat(mainSubject, isPresent());
     MethodSubject methodSubject = mainSubject.uniqueMethodWithName("booRunner");
     assertThat(methodSubject, isPresent());
-    verifyDevirtualized(methodSubject);
+    verifyNotDevirtualized(methodSubject);
 
     DebugTestConfig config = result.debugConfig();
     runDebugTest(config, MAIN.getCanonicalName(),
@@ -73,24 +86,24 @@
         run());
   }
 
-  private void verifyDevirtualized(MethodSubject method) {
-    long virtualCallCount = Streams.stream(method.iterateInstructions(instructionSubject -> {
-      if (instructionSubject.isInvokeVirtual()) {
-        return isDevirtualizedCall(instructionSubject.getMethod());
-      }
-      return false;
-    })).count();
-    long checkCastCount = Streams.stream(method.iterateInstructions(instructionSubject -> {
-      return instructionSubject.isCheckCast(IMPL.getTypeName());
-    })).count();
+  private void verifyNotDevirtualized(MethodSubject method) {
+    // Check all calls are on the interface. This used to check the replacement by the impl, but
+    // debug soft-pinning now prohibits that.
+    long virtualCallCount =
+        method
+            .streamInstructions()
+            .filter(i -> i.isInvokeInterface() && isInterfaceCall(i.getMethod()))
+            .count();
     assertTrue(virtualCallCount > 0);
-    // Make sure that all devirtualized calls don't share check-casted receiver.
-    // Rather, it should use its own check-casted receiver to not pass the local.
+    // Make sure that no calls share check-cast receivers.
+    long checkCastCount =
+        method.streamInstructions().filter(i -> i.isCheckCast(ITF.getTypeName())).count();
     assertEquals(virtualCallCount, checkCastCount);
   }
 
-  private static boolean isDevirtualizedCall(DexMethod method) {
-    return method.holder.toSourceString().equals(IMPL.getTypeName())
+  // The calls to the interface actually remain as debug implies dontoptimize.
+  private static boolean isInterfaceCall(DexMethod method) {
+    return method.holder.toSourceString().equals(ITF.getTypeName())
         && method.getArity() == 0
         && method.proto.returnType.isVoidType()
         && method.name.toString().equals("foo");
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index 116ce4a..df6d1a5 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -170,7 +170,9 @@
         "-keep class " + CLASS_NAME,
         "-keepclassmembers,allowobfuscation class " + CLASS_NAME + " { static <fields>; }",
         "-dontoptimize");
-    CodeInspector inspector = compileWithR8(builder, pgConfigs).inspector();
+    CodeInspector inspector =
+        compileWithR8(builder, testBuilder -> testBuilder.debug().addKeepRules(pgConfigs))
+            .inspector();
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -373,6 +375,7 @@
                 builder,
                 testBuilder ->
                     testBuilder
+                        .addDontOptimize()
                         .addKeepRules(
                             "-identifiernamestring class "
                                 + CLASS_NAME
@@ -420,9 +423,11 @@
         "invoke-static {v1}, LExample;->foo(Ljava/lang/String;)V",
         "return-void");
 
-    List<String> pgConfigs = ImmutableList.of(
-        "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
-        "-keep class " + CLASS_NAME);
+    List<String> pgConfigs =
+        ImmutableList.of(
+            "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
+            "-keep class " + CLASS_NAME,
+            "-dontoptimize");
     CodeInspector inspector = compileWithR8(builder, pgConfigs).inspector();
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -465,10 +470,12 @@
         "return-void");
     builder.addClass(BOO);
 
-    List<String> pgConfigs = ImmutableList.of(
-        "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
-        "-keep class " + CLASS_NAME,
-        "-keep,allowobfuscation class " + BOO);
+    List<String> pgConfigs =
+        ImmutableList.of(
+            "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
+            "-keep class " + CLASS_NAME,
+            "-keep,allowobfuscation class " + BOO,
+            "-dontoptimize");
     CodeInspector inspector = compileWithR8(builder, pgConfigs).inspector();
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -725,7 +732,6 @@
     return testForR8(Backend.DEX)
         .addProgramDexFileData(builder.compile())
         .apply(configuration)
-        .debug()
         .compile();
   }
 }
diff --git a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
index d2e1d70..aedd6a4 100644
--- a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
+++ b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
@@ -212,10 +212,12 @@
   }
 
   @Test
-  public void test() throws Exception {
-    runTest(this::validate, true, CompilationMode.DEBUG);
+  public void testRelease() throws Exception {
     runTest(this::validate, true, CompilationMode.RELEASE);
-    runTest(this::validate, false, CompilationMode.DEBUG);
+  }
+
+  @Test
+  public void testReleaseNoClassInline() throws Exception {
     runTest(this::validate, false, CompilationMode.RELEASE);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
index fe19640..23a5047 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.repackage;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -70,7 +69,7 @@
               MethodSubject main = mainClass.uniqueMethodWithName("main");
               assertThat(main, isPresentAndNotRenamed());
               ClassSubject aClass = inspector.clazz(A.class);
-              assertThat(aClass, isPresentAndRenamed());
+              assertThat(aClass, isPresentAndNotRenamed());
               LocalVariableTable localVariableTable = main.getLocalVariableTable();
               // Take the second index which is localValue
               assertEquals(2, localVariableTable.size());
diff --git a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
index afba8bd..dddb176 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
@@ -3,17 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.rewrite.switchmaps;
 
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8Command;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static org.hamcrest.MatcherAssert.assertThat;
+
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.List;
-import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -21,14 +20,16 @@
 @RunWith(Parameterized.class)
 public class RewriteSwitchMapsTest extends TestBase {
 
-  private Backend backend;
+  private final Backend backend;
 
-  @Parameterized.Parameters(name = "Backend: {0}")
-  public static Backend[] data() {
-    return ToolHelper.getBackends();
+  @Parameterized.Parameters(name = "{0}, backend: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        TestParametersBuilder.builder().withNoneRuntime().build(), ToolHelper.getBackends());
   }
 
-  public RewriteSwitchMapsTest(Backend backend) {
+  public RewriteSwitchMapsTest(TestParameters parameters, Backend backend) {
+    parameters.assertNoneRuntime();
     this.backend = backend;
   }
 
@@ -41,25 +42,13 @@
 
   @Test
   public void checkSwitchMapsRemoved() throws Exception {
-    run(CompilationMode.RELEASE);
-  }
-
-  @Test
-  public void checkSwitchMapsRemovedDebug() throws Exception {
-    run(CompilationMode.DEBUG);
-  }
-
-  private void run(CompilationMode compilationMode) throws Exception {
-    R8Command command =
-        R8Command.builder()
-            .addProgramFiles(Paths.get(ToolHelper.EXAMPLES_BUILD_DIR).resolve(JAR_FILE))
-            .addLibraryFiles(runtimeJar(backend))
-            .addProguardConfiguration(PG_CONFIG, Origin.unknown())
-            .setMode(compilationMode)
-            .setProgramConsumer(emptyConsumer(backend))
-            .build();
-    AndroidApp result = ToolHelper.runR8(command);
-    CodeInspector inspector = new CodeInspector(result);
-    Assert.assertFalse(inspector.clazz(SWITCHMAP_CLASS_NAME).isPresent());
+    testForR8(backend)
+        .addProgramFiles(Paths.get(ToolHelper.EXAMPLES_BUILD_DIR).resolve(JAR_FILE))
+        .addKeepRules(PG_CONFIG)
+        .compile()
+        .inspect(
+            inspector -> {
+              assertThat(inspector.clazz(SWITCHMAP_CLASS_NAME), isAbsent());
+            });
   }
 }