Version: 1.0.20
Merge: Do not allow common subexpression elimination for cmp on dalvik.
CL: https://r8-review.googlesource.com/c/r8/+/18880
R=sgjesse@google.com
Change-Id: Ic8810df7043bd82229ca0195a1bb3471bbdc5552
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 4c52353..a528e39 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "v1.0.19";
+ public static final String LABEL = "v1.0.20";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 4862d70..79d0060 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.utils.CfgPrinter;
+import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
import java.util.ArrayDeque;
import java.util.ArrayList;
@@ -44,11 +45,15 @@
public final boolean hasDebugPositions;
+ public final InternalOptions options;
+
public IRCode(
+ InternalOptions options,
DexEncodedMethod method,
LinkedList<BasicBlock> blocks,
ValueNumberGenerator valueNumberGenerator,
boolean hasDebugPositions) {
+ this.options = options;
this.method = method;
this.blocks = blocks;
this.valueNumberGenerator = valueNumberGenerator;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 0a27017..84b4666 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -390,7 +390,7 @@
joinPredecessorsWithIdenticalPhis();
// Package up the IR code.
- IRCode ir = new IRCode(method, blocks, valueNumberGenerator, hasDebugPositions);
+ IRCode ir = new IRCode(options, method, blocks, valueNumberGenerator, hasDebugPositions);
// Split critical edges to make sure that we have a place to insert phi moves if
// necessary.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index bebd2e2..54efe87 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -1583,8 +1583,17 @@
private static class CSEExpressionEquivalence extends Equivalence<Instruction> {
+ private final IRCode code;
+
+ private CSEExpressionEquivalence(IRCode code) {
+ this.code = code;
+ }
+
@Override
protected boolean doEquivalent(Instruction a, Instruction b) {
+ if (a.isCmp() && code.options.canHaveCmpLongBug()) {
+ return false;
+ }
// Note that we don't consider positions because CSE can at most remove an instruction.
if (a.getClass() != b.getClass() || !a.identicalNonValueNonPositionParts(b)) {
return false;
@@ -1668,7 +1677,7 @@
public void commonSubexpressionElimination(IRCode code) {
final ListMultimap<Wrapper<Instruction>, Value> instructionToValue = ArrayListMultimap.create();
final DominatorTree dominatorTree = new DominatorTree(code);
- final CSEExpressionEquivalence equivalence = new CSEExpressionEquivalence();
+ final CSEExpressionEquivalence equivalence = new CSEExpressionEquivalence(code);
for (int i = 0; i < dominatorTree.getSortedBlocks().length; i++) {
BasicBlock block = dominatorTree.getSortedBlocks()[i];
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
index d6f86d8..cd69b49 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
@@ -123,7 +123,8 @@
LinkedList<BasicBlock> blocks = new LinkedList<>();
blocks.add(block);
- IRCode code = new IRCode(null, blocks, new ValueNumberGenerator(), false);
+ IRCode code =
+ new IRCode(new InternalOptions(), null, blocks, new ValueNumberGenerator(), false);
PeepholeOptimizer.optimize(code,
new MockLinearScanRegisterAllocator(code, new InternalOptions()));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
index f76f6f1..1f61a30 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
@@ -17,6 +17,7 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.code.ValueNumberGenerator;
import com.android.tools.r8.ir.code.ValueType;
+import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
import java.util.LinkedList;
import org.junit.Test;
@@ -59,7 +60,8 @@
// Check that the goto in block0 remains. There was a bug in the trivial goto elimination
// that ended up removing that goto changing the code to start with the unreachable
// throw.
- IRCode code = new IRCode(null, blocks, new ValueNumberGenerator(), false);
+ IRCode code =
+ new IRCode(new InternalOptions(), null, blocks, new ValueNumberGenerator(), false);
CodeRewriter.collapsTrivialGotos(null, code);
assert code.blocks.get(0).isTrivialGoto();
assert blocks.contains(block0);
@@ -127,7 +129,8 @@
// Check that the goto in block0 remains. There was a bug in the trivial goto elimination
// that ended up removing that goto changing the code to start with the unreachable
// throw.
- IRCode code = new IRCode(null, blocks, new ValueNumberGenerator(), false);
+ IRCode code =
+ new IRCode(new InternalOptions(), null, blocks, new ValueNumberGenerator(), false);
CodeRewriter.collapsTrivialGotos(null, code);
assert block0.getInstructions().get(1).isIf();
assert block0.getInstructions().get(1).asIf().fallthroughBlock() == block1;