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