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 {