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