Ensure single caller inliner only prunes methods which are inlined
Fixes: b/326389642
Change-Id: I1b5e2d412e19a0aaf352bba45e434fda2c8f1949
diff --git a/src/main/java/com/android/tools/r8/optimize/singlecaller/SingleCallerScanner.java b/src/main/java/com/android/tools/r8/optimize/singlecaller/SingleCallerScanner.java
index cf0719c..f71e82f 100644
--- a/src/main/java/com/android/tools/r8/optimize/singlecaller/SingleCallerScanner.java
+++ b/src/main/java/com/android/tools/r8/optimize/singlecaller/SingleCallerScanner.java
@@ -181,7 +181,10 @@
ProgramMethodMap<Integer> counters = ProgramMethodMap.create();
for (LirInstructionView view : code) {
int opcode = view.getOpcode();
- if (opcode != LirOpcodes.INVOKEDIRECT && opcode != LirOpcodes.INVOKEDIRECT_ITF) {
+ if (opcode != LirOpcodes.INVOKEDIRECT
+ && opcode != LirOpcodes.INVOKEDIRECT_ITF
+ // JDK 17 generates invokevirtual to private methods.
+ && opcode != LirOpcodes.INVOKEVIRTUAL) {
continue;
}
DexMethod invokedMethod =
@@ -195,9 +198,9 @@
counters.put(resolvedMethod, counters.getOrDefault(resolvedMethod, 0) + 1);
}
}
- counters.forEach(
- (callee, counter) -> {
- if (counter > 1) {
+ callees.forEach(
+ (callee) -> {
+ if (!counters.containsKey(callee) || counters.get(callee) > 1) {
singleCallerMethodCandidates.remove(callee);
}
});