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()) {