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;