Disable redundant load elimination in debug mode

Bug: 169120386
Change-Id: I36b450fc05942afb1dc4ce3adc6e7a63cef5b68a
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
index 94c2bed..bcef49c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
@@ -40,6 +40,7 @@
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoCollection;
 import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
+import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.objects.Reference2IntMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap;
@@ -91,7 +92,9 @@
   }
 
   public static boolean shouldRun(AppView<?> appView, IRCode code) {
-    return appView.options().enableRedundantFieldLoadElimination
+    InternalOptions options = appView.options();
+    return options.enableRedundantFieldLoadElimination
+        && !options.debug
         && (code.metadata().mayHaveArrayGet()
             || code.metadata().mayHaveFieldInstruction()
             || code.metadata().mayHaveInitClass());
@@ -553,17 +556,6 @@
   }
 
   private void handleArrayGet(InstructionListIterator it, ArrayGet arrayGet) {
-    if (arrayGet.array().hasLocalInfo()) {
-      // The array may be modified through the debugger. Therefore subsequent reads of the same
-      // array slot may not read this local.
-      return;
-    }
-    if (arrayGet.outValue().hasLocalInfo()) {
-      // This local may be modified through the debugger. Therefore subsequent reads of the same
-      // array slot may not read this local.
-      return;
-    }
-
     Value array = arrayGet.array().getAliasedValue();
     Value index = arrayGet.index().getAliasedValue();
     ArraySlot arraySlot = ArraySlot.create(array, index, arrayGet.getMemberType());
@@ -601,11 +593,6 @@
       InstanceGet instanceGet,
       DexClassAndField field,
       AssumeRemover assumeRemover) {
-    if (instanceGet.outValue().hasLocalInfo()) {
-      clearMostRecentInstanceFieldWrite(instanceGet, field);
-      return;
-    }
-
     Value object = instanceGet.object().getAliasedValue();
     FieldAndObject fieldAndObject = new FieldAndObject(field.getReference(), object);
     FieldValue replacement = activeState.getInstanceFieldValue(fieldAndObject);
@@ -699,12 +686,6 @@
       AssumeRemover assumeRemover) {
     markClassAsInitialized(field.getHolderType());
 
-    if (staticGet.outValue().hasLocalInfo()) {
-      killNonFinalActiveFields(staticGet);
-      clearMostRecentStaticFieldWrite(staticGet, field);
-      return;
-    }
-
     FieldValue replacement = activeState.getStaticFieldValue(field.getReference());
     if (replacement != null) {
       markAssumeDynamicTypeUsersForRemoval(staticGet, replacement, assumeRemover);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java
index 403372c..b78279e 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java
@@ -4,12 +4,6 @@
 
 package com.android.tools.r8.ir.analysis.type;
 
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThrows;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.D8TestBuilder;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -38,32 +32,17 @@
 
   @Test
   public void test() throws Exception {
-    D8TestBuilder d8TestBuilder =
-        testForD8()
-            .addInnerClasses(NarrowingWithoutSubtypingTest.class)
-            .addOptionsModification(
-                options -> {
-                  options.testing.readInputStackMaps = readStackMap;
-                  options.testing.enableNarrowAndWideningingChecksInD8 = true;
-                  options.testing.noLocalsTableOnInput = true;
-                })
-            .setMinApi(parameters.getApiLevel());
-    if (readStackMap) {
-      d8TestBuilder
-          .run(parameters.getRuntime(), TestClass.class)
-          .assertSuccessWithOutputLines("Hello world!");
-    } else {
-      // TODO(b/169120386): We should not be narrowing in D8.
-      assertThrows(
-          CompilationFailedException.class,
-          () -> {
-            d8TestBuilder.compileWithExpectedDiagnostics(
-                diagnostics ->
-                    diagnostics.assertAllErrorsMatch(
-                        diagnosticMessage(
-                            containsString("java.lang.AssertionError: During NARROWING"))));
-          });
-    }
+    testForD8()
+        .addInnerClasses(NarrowingWithoutSubtypingTest.class)
+        .addOptionsModification(
+            options -> {
+              options.testing.readInputStackMaps = readStackMap;
+              options.testing.enableNarrowAndWideningingChecksInD8 = true;
+              options.testing.noLocalsTableOnInput = true;
+            })
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines("Hello world!");
   }
 
   static class TestClass {