Replace a few resolution usages with direct lookup.

Change-Id: I1310560c21c6761710e54079966383a8c42cd586
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 8d95888..9b31a58 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DebugLocalInfo;
 import com.android.tools.r8.graph.DexCallSite;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItem;
@@ -1377,10 +1378,16 @@
       // therefore we use an invoke-direct instead. We need to do this as the Android Runtime
       // will not allow invoke-virtual of a private method.
       DexMethod invocationMethod = (DexMethod) item;
-      if (invocationMethod.holder == method.method.holder) {
-        DexEncodedMethod directTarget = appView.appInfo().lookupDirectTarget(invocationMethod);
-        if (directTarget != null && invocationMethod.holder == directTarget.method.holder) {
-          type = Type.DIRECT;
+      DexType holderType = method.method.holder;
+      if (invocationMethod.holder == holderType) {
+        DexClass holderClass = appView.definitionFor(holderType);
+        assert holderClass != null && holderClass.isProgramClass();
+        if (holderClass != null) {
+          DexEncodedMethod directTarget = holderClass.lookupDirectMethod(invocationMethod);
+          if (directTarget != null && !directTarget.isStatic()) {
+            assert invocationMethod.holder == directTarget.method.holder;
+            type = Type.DIRECT;
+          }
         }
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
index 84247d0..8b57c10 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
@@ -6,6 +6,7 @@
 import static com.android.tools.r8.ir.code.DominatorTree.Assumption.MAY_HAVE_UNREACHABLE_BLOCKS;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
@@ -108,10 +109,15 @@
             // invoked method is same as that of the method we are processing now.
             DexMethod invokedMethod = current.asInvokeMethod().getInvokedMethod();
             if (invokedMethod.holder == code.method.method.holder) {
-              if (current.isInvokeDirect()) {
-                singleTarget = appView.appInfo().lookupDirectTarget(invokedMethod);
-              } else if (current.isInvokeStatic()) {
-                singleTarget = appView.appInfo().lookupStaticTarget(invokedMethod);
+              DexClass clazz = appView.definitionFor(invokedMethod.holder);
+              assert clazz != null && clazz.isProgramClass();
+              if (clazz != null) {
+                DexEncodedMethod directMethod = clazz.lookupDirectMethod(invokedMethod);
+                if (current.isInvokeDirect() && !directMethod.isStatic()) {
+                  singleTarget = directMethod;
+                } else if (current.isInvokeStatic() && directMethod.isStatic()) {
+                  singleTarget = directMethod;
+                }
               }
             }
           }