Fix check for absence of single caller inlined methods
Change-Id: Ib304b9599da5d963af90de0ce8ad5c63c80468db
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 0516577..3eab5e6 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -622,7 +622,7 @@
new BridgeHoisting(appViewWithLiveness).run();
- assert Inliner.verifyAllSingleCallerMethodsHaveBeenPruned(appView);
+ assert Inliner.verifyAllSingleCallerMethodsHaveBeenPruned(appViewWithLiveness);
assert appView.allMergedClasses().verifyAllSourcesPruned(appViewWithLiveness);
assert appView.validateUnboxedEnumsHaveBeenPruned();
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
index 84ec3c5..98c8bd2 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -71,6 +71,16 @@
definition.parameterAnnotationsList.collectIndexedItems(indexedItems);
}
+ public boolean canBeConvertedToAbstractMethod(AppView<AppInfoWithLiveness> appView) {
+ return (appView.options().canUseAbstractMethodOnNonAbstractClass()
+ || getHolder().isAbstract()
+ || getHolder().isInterface())
+ && !getAccessFlags().isNative()
+ && !getAccessFlags().isPrivate()
+ && !getAccessFlags().isStatic()
+ && !appView.appInfo().isFailedResolutionTarget(getReference());
+ }
+
public void convertToAbstractOrThrowNullMethod(AppView<AppInfoWithLiveness> appView) {
if (!convertToAbstractMethodIfPossible(appView)) {
convertToThrowNullMethod(appView);
@@ -78,14 +88,7 @@
}
private boolean convertToAbstractMethodIfPossible(AppView<AppInfoWithLiveness> appView) {
- boolean canBeAbstract =
- (appView.options().canUseAbstractMethodOnNonAbstractClass()
- || getHolder().isAbstract()
- || getHolder().isInterface())
- && !getAccessFlags().isNative()
- && !getAccessFlags().isPrivate()
- && !getAccessFlags().isStatic()
- && !appView.appInfo().isFailedResolutionTarget(getReference());
+ boolean canBeAbstract = canBeConvertedToAbstractMethod(appView);
if (canBeAbstract) {
MethodAccessFlags accessFlags = getAccessFlags();
accessFlags.demoteFromFinal();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 32df085..ecf8f25 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -1347,12 +1347,15 @@
singleCallerInlinedMethods.clear();
}
- public static boolean verifyAllSingleCallerMethodsHaveBeenPruned(AppView<?> appView) {
+ public static boolean verifyAllSingleCallerMethodsHaveBeenPruned(
+ AppView<AppInfoWithLiveness> appView) {
for (DexProgramClass clazz : appView.appInfo().classesWithDeterministicOrder()) {
- for (DexEncodedMethod method : clazz.methods()) {
- assert !method.getOptimizationInfo().hasBeenInlinedIntoSingleCallSite() || !method.hasCode()
- : "Method was single caller inlined: " + method.toSourceString();
- }
+ clazz.forEachProgramMethodMatching(
+ method -> method.getOptimizationInfo().hasBeenInlinedIntoSingleCallSite(),
+ method -> {
+ assert !method.getDefinition().hasCode()
+ || !method.canBeConvertedToAbstractMethod(appView);
+ });
}
return true;
}