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