Version 1.5.39

Cherry pick: Do not remove AssumeDynamicType instructions in blocks-to-be-removed

CL: https://r8-review.googlesource.com/c/r8/+/38880
Change-Id: I4cf72c21012f7e97a0ec01fb13265264ddc7827a
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index a07a0ab..7d84af5 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 = "1.5.38";
+  public static final String LABEL = "1.5.39";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
index cdd2f94..ae432c6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionIterator.java
@@ -414,7 +414,7 @@
       IRCode code,
       IRCode inlinee,
       ListIterator<BasicBlock> blocksIterator,
-      List<BasicBlock> blocksToRemove,
+      Set<BasicBlock> blocksToRemove,
       DexType downcast) {
     assert blocksToRemove != null;
     boolean inlineeCanThrow = canThrow(inlinee);
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
index bac5ac0..1329b63 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
@@ -8,8 +8,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.InternalOptions;
-import java.util.ArrayList;
-import java.util.List;
+import com.google.common.collect.Sets;
 import java.util.ListIterator;
 import java.util.Set;
 
@@ -159,12 +158,12 @@
       IRCode code,
       IRCode inlinee,
       ListIterator<BasicBlock> blockIterator,
-      List<BasicBlock> blocksToRemove,
+      Set<BasicBlock> blocksToRemove,
       DexType downcast);
 
-  /** See {@link #inlineInvoke(AppView, IRCode, IRCode, ListIterator, List, DexType)}. */
+  /** See {@link #inlineInvoke(AppView, IRCode, IRCode, ListIterator, Set, DexType)}. */
   default BasicBlock inlineInvoke(AppView<?> appView, IRCode code, IRCode inlinee) {
-    List<BasicBlock> blocksToRemove = new ArrayList<>();
+    Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
     BasicBlock result = inlineInvoke(appView, code, inlinee, null, blocksToRemove, null);
     code.removeBlocks(blocksToRemove);
     return result;
diff --git a/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionIterator.java b/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionIterator.java
index f394c7c..8982458 100644
--- a/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionIterator.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.InternalOptions;
-import java.util.List;
 import java.util.ListIterator;
 import java.util.Set;
 
@@ -68,7 +67,7 @@
       IRCode code,
       IRCode inlinee,
       ListIterator<BasicBlock> blockIterator,
-      List<BasicBlock> blocksToRemove,
+      Set<BasicBlock> blocksToRemove,
       DexType downcast) {
     return currentBlockIterator.inlineInvoke(
         appView, code, inlinee, blockIterator, blocksToRemove, downcast);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java b/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java
index 4546a07..f53b81a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java
@@ -84,9 +84,12 @@
     }
   }
 
-  public void removeMarkedInstructions() {
+  public void removeMarkedInstructions(Set<BasicBlock> blocksToBeRemoved) {
     if (!assumeDynamicTypeInstructionsToRemove.isEmpty()) {
       for (BasicBlock block : code.blocks) {
+        if (blocksToBeRemoved.contains(block)) {
+          continue;
+        }
         InstructionListIterator instructionIterator = block.listIterator();
         while (instructionIterator.hasNext()) {
           Instruction instruction = instructionIterator.next();
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 ba9de01..f7b74b2 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
@@ -1743,7 +1743,7 @@
         }
       }
     }
-    assumeDynamicTypeRemover.removeMarkedInstructions();
+    assumeDynamicTypeRemover.removeMarkedInstructions(blocksToBeRemoved);
     assumeDynamicTypeRemover.finish();
     if (!blocksToBeRemoved.isEmpty()) {
       code.removeBlocks(blocksToBeRemoved);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index ad7dfb8..9d3954f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -679,7 +679,7 @@
   private void performInliningImpl(
       InliningStrategy strategy, InliningOracle oracle, DexEncodedMethod context, IRCode code) {
     AssumeDynamicTypeRemover assumeDynamicTypeRemover = new AssumeDynamicTypeRemover(appView, code);
-    List<BasicBlock> blocksToRemove = new ArrayList<>();
+    Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
     ListIterator<BasicBlock> blockIterator = code.listIterator();
     ClassInitializationAnalysis classInitializationAnalysis =
         new ClassInitializationAnalysis(appView, code);
@@ -763,7 +763,7 @@
         }
       }
     }
-    assumeDynamicTypeRemover.removeMarkedInstructions();
+    assumeDynamicTypeRemover.removeMarkedInstructions(blocksToRemove);
     assumeDynamicTypeRemover.finish();
     classInitializationAnalysis.finish();
     oracle.finish();
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index 1a2c180..e3ee182 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -25,10 +25,12 @@
 import com.android.tools.r8.utils.Timing;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import org.junit.Test;
@@ -299,7 +301,7 @@
     test = codeForMultipleMethodReplaceTest(a, b);
     ListIterator<BasicBlock> blocksIterator = test.code.listIterator();
     Iterator<IRCode> inlinee = test.additionalCode.listIterator();  // IR code for a's
-    List<BasicBlock> blocksToRemove = new ArrayList<>();
+    Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
     while (blocksIterator.hasNext()) {
       BasicBlock block = blocksIterator.next();
       iterator = block.listIterator();
@@ -770,7 +772,7 @@
       TestApplication test = codeForInlineAlwaysThrowsMultiple(twoGuards);
       ListIterator<BasicBlock> blocksIterator = test.code.listIterator();
       Iterator<IRCode> inlinee = test.additionalCode.listIterator(); // IR code for a's.
-      List<BasicBlock> blocksToRemove = new ArrayList<>();
+      Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
       InstructionListIterator iterator;
       while (blocksIterator.hasNext()) {
         BasicBlock block = blocksIterator.next();
@@ -794,7 +796,7 @@
       TestApplication test = codeForInlineAlwaysThrowsMultiple(twoGuards);
       ListIterator<BasicBlock> blocksIterator = test.code.listIterator();
       Iterator<IRCode> inlinee = test.additionalCode.listIterator(3); // IR code for b's.
-      List<BasicBlock> blocksToRemove = new ArrayList<>();
+      Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
       InstructionListIterator iterator;
       while (blocksIterator.hasNext()) {
         BasicBlock block = blocksIterator.next();
@@ -926,7 +928,7 @@
       TestApplication test = codeForInlineAlwaysThrowsMultipleWithControlFlow(a, twoGuards);
       ListIterator<BasicBlock> blocksIterator = test.code.listIterator();
       Iterator<IRCode> inlinee = test.additionalCode.listIterator(); // IR code for a's.
-      List<BasicBlock> blocksToRemove = new ArrayList<>();
+      Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
       InstructionListIterator iterator;
       while (blocksIterator.hasNext()) {
         BasicBlock block = blocksIterator.next();
@@ -950,7 +952,7 @@
       TestApplication test = codeForInlineAlwaysThrowsMultipleWithControlFlow(a, twoGuards);
       ListIterator<BasicBlock> blocksIterator = test.code.listIterator();
       Iterator<IRCode> inlinee = test.additionalCode.listIterator(3); // IR code for b's.
-      List<BasicBlock> blocksToRemove = new ArrayList<>();
+      Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
       InstructionListIterator iterator;
       while (blocksIterator.hasNext()) {
         BasicBlock block = blocksIterator.next();
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
index b251214..ed65e08 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
@@ -128,7 +128,7 @@
         IRCode code,
         IRCode inlinee,
         ListIterator<BasicBlock> blockIterator,
-        List<BasicBlock> blocksToRemove,
+        Set<BasicBlock> blocksToRemove,
         DexType downcast) {
       throw new Unimplemented();
     }