Fix check-cast insertion in presence of catch handlers

Bug: 211836449
Change-Id: I510f1229718bfdb61d8a502b48bcd1e7711ff32d
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java b/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java
index e97d8c5..bff70f5 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/InterfaceTypeToClassTypeLensCodeRewriterHelperImpl.java
@@ -163,8 +163,9 @@
                   operand, block, originalType, rewrittenType, isCodeFullyRewrittenWithLens);
           assert !needsCastForOperand.isUnknown();
           if (needsCastForOperand.isTrue()) {
-            insertCastForOperand(
-                operand, rewrittenType, instruction, blockIterator, block, instructionIterator);
+            instructionIterator =
+                insertCastForOperand(
+                    operand, rewrittenType, instruction, blockIterator, block, instructionIterator);
           }
         }
       }
@@ -181,7 +182,7 @@
         .addLast(new WorklistItem(operandIndex, originalType, rewrittenType));
   }
 
-  private void insertCastForOperand(
+  private InstructionListIterator insertCastForOperand(
       Value operand,
       DexType castType,
       Instruction rewrittenUser,
@@ -199,10 +200,11 @@
             .setPosition(rewrittenUser)
             .build();
     if (block.hasCatchHandlers()) {
-      instructionIterator
-          .splitCopyCatchHandlers(code, blockIterator, appView.options())
-          .listIterator(code)
-          .add(checkCast);
+      BasicBlock splitBlock =
+          instructionIterator.splitCopyCatchHandlers(code, blockIterator, appView.options());
+      instructionIterator.previous();
+      instructionIterator.add(checkCast);
+      instructionIterator = splitBlock.listIterator(code);
     } else {
       instructionIterator.add(checkCast);
     }
@@ -210,6 +212,7 @@
 
     Instruction next = instructionIterator.next();
     assert next == rewrittenUser;
+    return instructionIterator;
   }
 
   private boolean isOperandRewrittenWithLens(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InterfaceInvokeWithObjectReceiverInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InterfaceInvokeWithObjectReceiverInliningTest.java
index 8573c7b..cc1ded1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InterfaceInvokeWithObjectReceiverInliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InterfaceInvokeWithObjectReceiverInliningTest.java
@@ -75,7 +75,7 @@
         .setMinApi(parameters.getApiLevel())
         .compile()
         .run(parameters.getRuntime(), Main.class)
-        .assertSuccessWithOutputLines("0");
+        .assertSuccessWithOutputLines("0", "0");
   }
 
   private static byte[] getTransformedMain() throws IOException {
@@ -98,6 +98,13 @@
     public static void main(String[] args) {
       // Transformed from `I get(int)` to `Object get(int)`.
       get(args.length).m();
+
+      // Transformed from `I get(int)` to `Object get(int)`.
+      try {
+        get(args.length).m();
+      } catch (Exception e) {
+        throw new RuntimeException();
+      }
     }
 
     // @Keep