Always consider wide registers clobbered when re-using constant instructions
A reused wide value still have to invalidate covering wide constants.
Bug: 136717060
Change-Id: I10a3ea336b292a1d0371e34c35ebde095f71870c
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
index 66a1106..87c0737 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
@@ -483,9 +483,8 @@
registerToNumber.put(outRegister, current.asConstNumber());
if (current.outType().isWide()) {
registerToNumber.remove(outRegister + 1);
- } else {
- removeWideConstantCovering(registerToNumber, outRegister);
}
+ removeWideConstantCovering(registerToNumber, outRegister);
}
} else {
// This instruction writes registers with a non-constant value. Remove the registers
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B136717060.java b/src/test/java/com/android/tools/r8/ir/regalloc/B136717060.java
index 3b9edfc..3de2b40 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B136717060.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B136717060.java
@@ -4,16 +4,9 @@
package com.android.tools.r8.ir.regalloc;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.core.AnyOf.anyOf;
-import static org.hamcrest.core.StringContains.containsString;
-
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -32,22 +25,14 @@
this.parameters = parameters;
}
- private void checkSomething(CodeInspector inspector) {
- ClassSubject classSubject = inspector.clazz(TestClass.class);
- assertThat(classSubject, isPresent());
- }
-
@Test
public void test() throws Exception {
testForD8()
.addInnerClasses(B136717060.class)
.setMinApi(parameters.getRuntime())
.compile()
- .disassemble()
- .inspect(this::checkSomething)
.run(parameters.getRuntime(), TestClass.class)
- .assertFailureWithErrorThatMatches(
- anyOf(containsString("rejecting opcode"), containsString("Precise Low-half Constant")));
+ .assertSuccess();
}
static class TestClass {
@@ -64,6 +49,6 @@
method(Long.MIN_VALUE, -1, Long.MIN_VALUE, 0L);
}
- static void method(long x, long y, Object divExpected, Object modExpected) {}
+ static void method(long x, long y, Object a, Object b) {}
}
}