Account for new method resolution optimization info in optimizations

Change-Id: I45438ffe710b25d136a3ca69d1e71937fda5413f
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
index fa5469f..aad507a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexEncodedMethod;
@@ -17,6 +18,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.LookupResult;
 import com.android.tools.r8.graph.MethodResolutionResult;
+import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet;
@@ -30,6 +32,7 @@
 import com.android.tools.r8.ir.optimize.DefaultInliningOracle;
 import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
+import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
 import com.android.tools.r8.ir.optimize.inliner.WhyAreYouNotInliningReporter;
 import com.android.tools.r8.ir.regalloc.RegisterAllocator;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -37,7 +40,6 @@
 import com.android.tools.r8.utils.collections.ProgramMethodSet;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
-import java.util.BitSet;
 import java.util.Collections;
 import java.util.List;
 
@@ -113,6 +115,11 @@
     return this;
   }
 
+  public MethodResolutionResult resolveMethod(
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return appView.appInfo().resolveMethod(method, getInterfaceBit());
+  }
+
   // In subclasses, e.g., invoke-virtual or invoke-super, use a narrower receiver type by using
   // receiver type and calling context---the holder of the method where the current invocation is.
   // TODO(b/140204899): Refactor lookup methods to be defined in a single place.
@@ -266,13 +273,25 @@
 
   @Override
   public boolean throwsNpeIfValueIsNull(Value value, AppView<?> appView, ProgramMethod context) {
+    if (!appView.hasClassHierarchy()) {
+      return false;
+    }
+    AppView<? extends AppInfoWithClassHierarchy> appViewWithClassHierarchy =
+        appView.withClassHierarchy();
+    SingleResolutionResult<?> resolutionResult =
+        resolveMethod(appViewWithClassHierarchy).asSingleResolution();
+    if (resolutionResult == null) {
+      return false;
+    }
     DexClassAndMethod singleTarget = lookupSingleTarget(appView, context);
-    if (singleTarget != null) {
-      BitSet nonNullParamOrThrow =
-          singleTarget.getDefinition().getOptimizationInfo().getNonNullParamOrThrow();
-      if (nonNullParamOrThrow != null) {
-        int argumentIndex = inValues.indexOf(value);
-        return argumentIndex >= 0 && nonNullParamOrThrow.get(argumentIndex);
+    MethodOptimizationInfo optimizationInfo =
+        resolutionResult.getOptimizationInfo(appView, this, singleTarget);
+    if (optimizationInfo.hasNonNullParamOrThrow()) {
+      for (int argumentIndex = 0; argumentIndex < arguments().size(); argumentIndex++) {
+        if (value == getArgument(argumentIndex)
+            && optimizationInfo.getNonNullParamOrThrow().get(argumentIndex)) {
+          return true;
+        }
       }
     }
     return false;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
index 27e709e..2521043 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
@@ -250,10 +250,7 @@
         appView.withClassHierarchy();
 
     SingleResolutionResult<?> resolutionResult =
-        appViewWithClassHierarchy
-            .appInfo()
-            .resolveMethodLegacy(getInvokedMethod(), getInterfaceBit())
-            .asSingleResolution();
+        resolveMethod(appViewWithClassHierarchy).asSingleResolution();
     if (resolutionResult == null) {
       return true;
     }
@@ -275,6 +272,12 @@
 
     // Find the target and check if the invoke may have side effects.
     DexClassAndMethod singleTarget = lookupSingleTarget(appView, context);
+    MethodOptimizationInfo optimizationInfo =
+        resolutionResult.getOptimizationInfo(appView, this, singleTarget);
+    if (!optimizationInfo.mayHaveSideEffects(this, appView.options())) {
+      return false;
+    }
+
     if (singleTarget == null) {
       return true;
     }
@@ -291,10 +294,8 @@
       return false;
     }
 
-    DexEncodedMethod singleTargetDefinition = singleTarget.getDefinition();
-    MethodOptimizationInfo optimizationInfo = singleTargetDefinition.getOptimizationInfo();
     if (assumption.canIgnoreInstanceFieldAssignmentsToReceiver()
-        && singleTargetDefinition.isInstanceInitializer()) {
+        && singleTarget.getDefinition().isInstanceInitializer()) {
       assert isInvokeDirect();
       InstanceInitializerInfo initializerInfo =
           optimizationInfo.getInstanceInitializerInfo(asInvokeDirect());
@@ -303,6 +304,6 @@
       }
     }
 
-    return optimizationInfo.mayHaveSideEffects(this, appView.options());
+    return true;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
index f8f6235..b9b34ad 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
@@ -6,9 +6,11 @@
 
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.CatchHandlers;
@@ -270,18 +272,22 @@
           }
         }
 
-        if (!instruction.isInvokeMethod()) {
+        if (!appView.hasClassHierarchy() || !instruction.isInvokeMethod()) {
           continue;
         }
 
+        AppView<? extends AppInfoWithClassHierarchy> appViewWithClassHierarchy =
+            appView.withClassHierarchy();
         InvokeMethod invoke = instruction.asInvokeMethod();
-        DexClassAndMethod singleTarget = invoke.lookupSingleTarget(appView, code.context());
-        if (singleTarget == null) {
+        SingleResolutionResult<?> resolutionResult =
+            invoke.resolveMethod(appViewWithClassHierarchy).asSingleResolution();
+        if (resolutionResult == null) {
           continue;
         }
 
+        DexClassAndMethod singleTarget = invoke.lookupSingleTarget(appView, code.context());
         MethodOptimizationInfo optimizationInfo =
-            singleTarget.getDefinition().getOptimizationInfo();
+            resolutionResult.getOptimizationInfo(appViewWithClassHierarchy, invoke, singleTarget);
 
         // If the invoke instruction is a null check, we can remove it.
         boolean isNullCheck = false;