Force compiling without locals information for release mode

We also move the check up for when to do build with locals so invalid
debug information will now be caught correctly.

Bug: 123850906
Change-Id: I029cc0d67f3161f25eeece146bf1af00a0b06a2e
diff --git a/src/main/java/com/android/tools/r8/graph/JarCode.java b/src/main/java/com/android/tools/r8/graph/JarCode.java
index c203270..64919d4 100644
--- a/src/main/java/com/android/tools/r8/graph/JarCode.java
+++ b/src/main/java/com/android/tools/r8/graph/JarCode.java
@@ -125,12 +125,8 @@
       GraphLense graphLense,
       InternalOptions options,
       Origin origin) {
-    assert getOwner() == encodedMethod;
-    triggerDelayedParsingIfNeccessary();
-    return options.debug || encodedMethod.getOptimizationInfo().isReachabilitySensitive()
-        ? internalBuildWithLocals(
-            encodedMethod, encodedMethod, appInfo, graphLense, options, null, null)
-        : internalBuild(encodedMethod, encodedMethod, appInfo, graphLense, options, null, null);
+    return internalBuildPossiblyWithLocals(
+        encodedMethod, encodedMethod, appInfo, graphLense, options, null, null);
   }
 
   @Override
@@ -143,14 +139,30 @@
       ValueNumberGenerator generator,
       Position callerPosition,
       Origin origin) {
-    assert getOwner() == encodedMethod;
     assert generator != null;
+    return internalBuildPossiblyWithLocals(
+        context, encodedMethod, appInfo, graphLense, options, generator, callerPosition);
+  }
+
+  private IRCode internalBuildPossiblyWithLocals(
+      DexEncodedMethod context,
+      DexEncodedMethod encodedMethod,
+      AppInfo appInfo,
+      GraphLense graphLense,
+      InternalOptions options,
+      ValueNumberGenerator generator,
+      Position callerPosition) {
+    assert getOwner() == encodedMethod;
     triggerDelayedParsingIfNeccessary();
-    return options.debug || encodedMethod.getOptimizationInfo().isReachabilitySensitive()
-        ? internalBuildWithLocals(
-            context, encodedMethod, appInfo, graphLense, options, generator, callerPosition)
-        : internalBuild(
-            context, encodedMethod, appInfo, graphLense, options, generator, callerPosition);
+    if (!keepLocals(encodedMethod, options)) {
+      // We strip locals here because we will not be able to recover from invalid info.
+      node.localVariables.clear();
+      return internalBuild(
+          context, encodedMethod, appInfo, graphLense, options, generator, callerPosition);
+    } else {
+      return internalBuildWithLocals(
+          context, encodedMethod, appInfo, graphLense, options, generator, callerPosition);
+    }
   }
 
   private IRCode internalBuildWithLocals(
@@ -176,14 +188,10 @@
     if (options.testing.noLocalsTableOnInput) {
       return false;
     }
-    if (options.debug) {
+    if (options.debug || encodedMethod.getOptimizationInfo().isReachabilitySensitive()) {
       return true;
     }
-    if (options.getProguardConfiguration() != null
-        && options.getProguardConfiguration().getKeepAttributes().localVariableTable) {
-      return true;
-    }
-    return encodedMethod.getOptimizationInfo().isReachabilitySensitive();
+    return false;
   }
 
   private IRCode internalBuild(
@@ -194,9 +202,7 @@
       InternalOptions options,
       ValueNumberGenerator generator,
       Position callerPosition) {
-    if (!keepLocals(encodedMethod, options)) {
-      node.localVariables.clear();
-    }
+    assert node.localVariables.isEmpty() || keepLocals(encodedMethod, options);
     JarSourceCode source =
         new JarSourceCode(
             method.getHolder(),