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);
     }