Do not remove AssumeDynamicType instructions in blocks-to-be-removed
Change-Id: I482897d0390df81430ddfc724d0387eab89962a1
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 dcc416e..e323023 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 1aca825..5d1ab42 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
@@ -793,7 +793,7 @@
IRCode code,
OptimizationFeedback feedback) {
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);
@@ -881,7 +881,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 020551e..acdcf28 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();
}