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