At most run path constraint analysis once per method
Change-Id: Iab66b4efc70391b58653383ada85b954f623f8ca
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
index 68a353e..b72657b 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorCodeScanner.java
@@ -229,6 +229,9 @@
protected final IRCode code;
protected final ProgramMethod context;
+ private SuccessfulDataflowAnalysisResult<BasicBlock, PathConstraintAnalysisState>
+ pathConstraintAnalysisResult;
+
protected CodeScanner(
AbstractValueSupplier abstractValueSupplier, IRCode code, ProgramMethod method) {
this.abstractValueSupplier = abstractValueSupplier;
@@ -402,15 +405,10 @@
if (phi.getOperands().size() != 2 || !phi.hasOperandThatMatches(Value::isArgument)) {
return null;
}
- PathConstraintAnalysis analysis =
- new PathConstraintAnalysis(appView, code, methodParameterFactory);
- SuccessfulDataflowAnalysisResult<BasicBlock, PathConstraintAnalysisState> result =
- analysis.run(code.entryBlock()).asSuccessfulAnalysisResult();
- assert result != null;
ConcretePathConstraintAnalysisState leftPredecessorPathConstraint =
- result.getBlockExitState(phi.getBlock().getPredecessors().get(0)).asConcreteState();
+ getPathConstraint(phi.getBlock().getPredecessors().get(0)).asConcreteState();
ConcretePathConstraintAnalysisState rightPredecessorPathConstraint =
- result.getBlockExitState(phi.getBlock().getPredecessors().get(1)).asConcreteState();
+ getPathConstraint(phi.getBlock().getPredecessors().get(1)).asConcreteState();
if (leftPredecessorPathConstraint == null || rightPredecessorPathConstraint == null) {
return null;
}
@@ -878,6 +876,16 @@
}
}
+ private PathConstraintAnalysisState getPathConstraint(BasicBlock block) {
+ if (pathConstraintAnalysisResult == null) {
+ PathConstraintAnalysis analysis =
+ new PathConstraintAnalysis(appView, code, methodParameterFactory);
+ pathConstraintAnalysisResult = analysis.run(code.entryBlock()).asSuccessfulAnalysisResult();
+ assert pathConstraintAnalysisResult != null;
+ }
+ return pathConstraintAnalysisResult.getBlockExitState(block);
+ }
+
@SuppressWarnings("ReferenceEquality")
private DexMethod getRepresentative(InvokeMethod invoke, ProgramMethod resolvedMethod) {
if (resolvedMethod.getDefinition().belongsToDirectPool()) {