Fix incorrect handling of library call in class inliner
Bug: b/423658598
Change-Id: I45b678e8d576647bb3c88bd3d1d9be7b9e9b7617
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 5365575..b84e744 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -538,16 +538,20 @@
throw new IllegalClassInlinerStateException();
}
- ProgramMethod singleTarget =
- dispatchTargetLookupResult
- .asSingleResult()
- .getSingleDispatchTarget()
- .asProgramMethod();
- if (singleTarget == null || !indirectMethodCallsOnInstance.contains(singleTarget)) {
+ DexClassAndMethod singleTarget =
+ dispatchTargetLookupResult.asSingleResult().getSingleDispatchTarget();
+ if (singleTarget.isLibraryMethod()) {
+ // Library calls (e.g., calls to Object.getClass) are handled in removeMiscUsages.
+ continue;
+ }
+
+ ProgramMethod singleProgramTarget = singleTarget.asProgramMethod();
+ if (singleProgramTarget == null
+ || !indirectMethodCallsOnInstance.contains(singleProgramTarget)) {
throw new IllegalClassInlinerStateException();
}
- methodCallsOnInstance.put(invoke, new InliningInfo(singleTarget, null));
+ methodCallsOnInstance.put(invoke, new InliningInfo(singleProgramTarget, null));
}
}
currentUsers = indirectOutValueUsers;