Avoid unnecessary lookups in optimizations

Change-Id: I705ceec089f02a96e1f3d81ddc7f41c0ecf21477
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 48e880c..99b38dc 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -1841,30 +1841,26 @@
                 invoke.setOutValue(null);
               }
             } else if (appView.appInfo().hasLiveness()) {
+              // Check if the invoked method is known to return one of its arguments.
               DexEncodedMethod target =
                   invoke.lookupSingleTarget(appView.withLiveness(), code.method.method.holder);
-              if (target != null) {
-                DexMethod invokedMethod = target.method;
-                // Check if the invoked method is known to return one of its arguments.
-                DexEncodedMethod definition = appView.definitionFor(invokedMethod);
-                if (definition != null && definition.getOptimizationInfo().returnsArgument()) {
-                  int argumentIndex = definition.getOptimizationInfo().getReturnedArgument();
-                  // Replace the out value of the invoke with the argument and ignore the out value.
-                  if (argumentIndex >= 0 && checkArgumentType(invoke, argumentIndex)) {
-                    Value argument = invoke.arguments().get(argumentIndex);
-                    assert outValue.verifyCompatible(argument.outType());
-                    // Make sure that we are only narrowing information here. Note, in cases where
-                    // we cannot find the definition of types, computing lessThanOrEqual will
-                    // return false unless it is object.
-                    if (argument
-                        .getTypeLattice()
-                        .lessThanOrEqual(outValue.getTypeLattice(), appView)) {
-                      affectedValues.addAll(outValue.affectedValues());
-                      assumeDynamicTypeRemover.markUsersForRemoval(outValue);
-                      mayHaveRemovedTrivialPhi |= outValue.numberOfPhiUsers() > 0;
-                      outValue.replaceUsers(argument);
-                      invoke.setOutValue(null);
-                    }
+              if (target != null && target.getOptimizationInfo().returnsArgument()) {
+                int argumentIndex = target.getOptimizationInfo().getReturnedArgument();
+                // Replace the out value of the invoke with the argument and ignore the out value.
+                if (argumentIndex >= 0 && checkArgumentType(invoke, argumentIndex)) {
+                  Value argument = invoke.arguments().get(argumentIndex);
+                  assert outValue.verifyCompatible(argument.outType());
+                  // Make sure that we are only narrowing information here. Note, in cases where
+                  // we cannot find the definition of types, computing lessThanOrEqual will
+                  // return false unless it is object.
+                  if (argument
+                      .getTypeLattice()
+                      .lessThanOrEqual(outValue.getTypeLattice(), appView)) {
+                    affectedValues.addAll(outValue.affectedValues());
+                    assumeDynamicTypeRemover.markUsersForRemoval(outValue);
+                    mayHaveRemovedTrivialPhi |= outValue.numberOfPhiUsers() > 0;
+                    outValue.replaceUsers(argument);
+                    invoke.setOutValue(null);
                   }
                 }
               }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
index 17fea4b..1cbbc26 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
@@ -258,22 +258,22 @@
     if (!invokedHolder.isClassType()) {
       return;
     }
-    DexEncodedMethod definition = current.lookupSingleTarget(appView, callingContext);
-    if (definition != null && definition.isInstanceInitializer()) {
+    DexEncodedMethod target = current.lookupSingleTarget(appView, callingContext);
+    if (target != null && target.isInstanceInitializer()) {
       // Member value propagation does not apply to constructors. Removing a call to a constructor
       // that is marked as having no side effects could lead to verification errors, due to
       // uninitialized instances being used.
       return;
     }
 
-    ProguardMemberRuleLookup lookup = lookupMemberRule(definition);
+    ProguardMemberRuleLookup lookup = lookupMemberRule(target);
     if (lookup == null) {
       // -assumenosideeffects rules are applied to upward visible and overriding methods, but only
       // references that have actual definitions are marked by the root set builder. So, here, we
       // try again with a resolved target, not the direct definition, which may not exist.
-      DexEncodedMethod target =
+      DexEncodedMethod resolutionTarget =
           appView.appInfo().resolveMethod(invokedHolder, invokedMethod).asSingleTarget();
-      lookup = lookupMemberRule(target);
+      lookup = lookupMemberRule(resolutionTarget);
     }
     boolean invokeReplaced = false;
     if (lookup != null) {
@@ -295,7 +295,6 @@
       return;
     }
     // No Proguard rule could replace the instruction check for knowledge about the return value.
-    DexEncodedMethod target = current.lookupSingleTarget(appView, callingContext);
     if (target == null || !mayPropagateValueFor(target)) {
       return;
     }