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 {