Rewrite synthesized move-exception instructions in lens code rewriter
The call to addThrowingInstructionToPossiblyThrowingBlock() may lead to critical edges being split, which can lead to move-exception instructions being synthesized.
Change-Id: I194066cfb0b31385996f22462a912fe60639636d
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index c9377f7..e81d765 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -1749,7 +1749,7 @@
// one new phi to merge the two exception values, and all other phis don't need
// to be changed.
for (BasicBlock catchSuccessor : catchSuccessors) {
- catchSuccessor.splitCriticalExceptionEdges(code, blockIterator::add, options);
+ catchSuccessor.splitCriticalExceptionEdges(code, blockIterator, options);
}
}
@@ -1767,7 +1767,7 @@
* and Goto.
*/
public void splitCriticalExceptionEdges(
- IRCode code, Consumer<BasicBlock> onNewBlock, InternalOptions options) {
+ IRCode code, ListIterator<BasicBlock> blockIterator, InternalOptions options) {
List<BasicBlock> predecessors = getMutablePredecessors();
boolean hasMoveException = entry().isMoveException();
TypeElement exceptionTypeLattice = null;
@@ -1783,7 +1783,7 @@
getInstructions().remove(0);
}
// Create new predecessor blocks.
- List<BasicBlock> newPredecessors = new ArrayList<>();
+ List<BasicBlock> newPredecessors = new ArrayList<>(predecessors.size());
List<Value> values = new ArrayList<>(predecessors.size());
for (BasicBlock predecessor : predecessors) {
if (!predecessor.hasCatchSuccessor(this)) {
@@ -1808,7 +1808,7 @@
newBlock.getMutableSuccessors().add(this);
newBlock.getMutablePredecessors().add(predecessor);
predecessor.replaceSuccessor(this, newBlock);
- onNewBlock.accept(newBlock);
+ blockIterator.add(newBlock);
assert newBlock.getNumber() >= 0 : "Number must be assigned by `onNewBlock`";
}
// Replace the blocks predecessors with the new ones.
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
index 5f56717..ee770e8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
@@ -135,6 +135,9 @@
assert !block.hasCatchHandlers();
assert splitBlock.hasCatchHandlers();
block.copyCatchHandlers(code, blockIterator, splitBlock, options);
+ while (IteratorUtils.peekPrevious(blockIterator) != splitBlock) {
+ blockIterator.previous();
+ }
} else {
add(instruction);
}