Verify kept non-abstract methods have no optimization info
Change-Id: If29af4703695516141d1feaf256da7de6b7e99ba
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 6ef6ae4..53e4ddc 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -116,7 +116,7 @@
getDefinition().setApiLevelForCode(appView.computedMinApiLevel());
setCode(ThrowNullCode.get(), appView);
getSimpleFeedback().markProcessed(getDefinition(), ConstraintWithTarget.ALWAYS);
- getSimpleFeedback().unsetOptimizationInfoForThrowNullMethod(this);
+ getSimpleFeedback().unsetOptimizationInfoForThrowNullMethod(appView, this);
}
public void registerCodeReferences(UseRegistry<?> registry) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
index 7327760..e5a0728 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
@@ -143,10 +143,14 @@
}
}
- default void unsetOptimizationInfoForThrowNullMethod(ProgramMethod method) {
- unsetOptimizationInfoForAbstractMethod(method);
- methodNeverReturnsNormally(method);
- setUnusedArguments(
- method, BitSetUtils.createFilled(true, method.getDefinition().getNumberOfArguments()));
+ default void unsetOptimizationInfoForThrowNullMethod(AppView<?> appView, ProgramMethod method) {
+ if (!appView.hasClassHierarchy() || appView.getKeepInfo(method).isPinned(appView.options())) {
+ assert method.getOptimizationInfo().isDefault();
+ } else {
+ unsetOptimizationInfoForAbstractMethod(method);
+ methodNeverReturnsNormally(method);
+ setUnusedArguments(
+ method, BitSetUtils.createFilled(true, method.getDefinition().getNumberOfArguments()));
+ }
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodResolutionOptimizationInfoAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodResolutionOptimizationInfoAnalysis.java
index 2718a91..0f6738d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodResolutionOptimizationInfoAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodResolutionOptimizationInfoAnalysis.java
@@ -164,13 +164,15 @@
} else {
for (DexEncodedMethod method : clazz.virtualMethods()) {
KeepMethodInfo keepInfo = appView.getKeepInfo().getMethodInfo(method, clazz);
- if (!method.isAbstract()) {
- newState.joinMethodOptimizationInfo(
- appView, method.getSignature(), method.getOptimizationInfo());
- } else if (!keepInfo.isShrinkingAllowed(appView.options())) {
- // Method is kept and could be overridden outside app (e.g., in tests).
+ if (!keepInfo.isShrinkingAllowed(appView.options())) {
+ // Method is kept and could be overridden outside app (e.g., in tests). Verify we don't
+ // have any optimization info recorded for non-abstract methods.
+ assert method.isAbstract() || method.getOptimizationInfo().isDefault();
newState.joinMethodOptimizationInfo(
appView, method.getSignature(), DefaultMethodOptimizationInfo.getInstance());
+ } else if (!method.isAbstract()) {
+ newState.joinMethodOptimizationInfo(
+ appView, method.getSignature(), method.getOptimizationInfo());
}
}
}