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;