Rename hasSingleInFlow

Change-Id: Id6cc78fd5adf4120276fa07210fba185fd6d2bb4
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java
index ec8d43e..6830918 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/AbstractFunction.java
@@ -42,8 +42,8 @@
    */
   Iterable<BaseInFlow> getBaseInFlow();
 
-  default boolean hasSingleInFlow() {
-    return true;
+  default boolean usesFlowGraphStateProvider() {
+    return false;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java
index c51a4cf..385c957 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/FlowGraphStateProvider.java
@@ -15,44 +15,44 @@
     if (!InternalOptions.assertionsEnabled()) {
       return flowGraph;
     }
-    // If the abstract function is a canonical function, or the abstract function has a single
-    // declared input, we should never perform any state lookups.
-    if (abstractFunction.hasSingleInFlow()) {
-      assert abstractFunction.isIdentity()
-          || abstractFunction.isCastAbstractFunction()
-          || abstractFunction.isUnknownAbstractFunction()
-          || abstractFunction.isUpdateChangedFlagsAbstractFunction();
+    // If the abstract function needs to perform state lookups, we restrict state lookups to the
+    // declared base in flow. This is important for arriving at the correct fix point.
+    if (abstractFunction.usesFlowGraphStateProvider()) {
+      assert abstractFunction.isIfThenElseAbstractFunction()
+          || abstractFunction.isInstanceFieldReadAbstractFunction();
       return new FlowGraphStateProvider() {
 
         @Override
         public ValueState getState(DexField field) {
-          throw new Unreachable();
+          assert abstractFunction.verifyContainsBaseInFlow(new FieldValue(field));
+          return flowGraph.getState(field);
         }
 
         @Override
         public ValueState getState(
             MethodParameter methodParameter, Supplier<ValueState> defaultStateProvider) {
-          throw new Unreachable();
+          assert abstractFunction.verifyContainsBaseInFlow(methodParameter);
+          return flowGraph.getState(methodParameter, defaultStateProvider);
         }
       };
     }
-    // Otherwise, restrict state lookups to the declared base in flow. This is required for arriving
-    // at the correct fix point.
-    assert abstractFunction.isIfThenElseAbstractFunction()
-        || abstractFunction.isInstanceFieldReadAbstractFunction();
+    // Otherwise, the abstract function is a canonical function, or the abstract function has a
+    // single declared input, meaning we should never perform any state lookups.
+    assert abstractFunction.isIdentity()
+        || abstractFunction.isCastAbstractFunction()
+        || abstractFunction.isUnknownAbstractFunction()
+        || abstractFunction.isUpdateChangedFlagsAbstractFunction();
     return new FlowGraphStateProvider() {
 
       @Override
       public ValueState getState(DexField field) {
-        assert abstractFunction.verifyContainsBaseInFlow(new FieldValue(field));
-        return flowGraph.getState(field);
+        throw new Unreachable();
       }
 
       @Override
       public ValueState getState(
           MethodParameter methodParameter, Supplier<ValueState> defaultStateProvider) {
-        assert abstractFunction.verifyContainsBaseInFlow(methodParameter);
-        return flowGraph.getState(methodParameter, defaultStateProvider);
+        throw new Unreachable();
       }
     };
   }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java
index 1e24de2..a6da375 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/IfThenElseAbstractFunction.java
@@ -128,10 +128,8 @@
   }
 
   @Override
-  public boolean hasSingleInFlow() {
-    // TODO(b/302281503): This method is used to determine if arbitrary state lookup is allowed.
-    //  Rename this method.
-    return false;
+  public boolean usesFlowGraphStateProvider() {
+    return true;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java
index 893a043..d9c23c4 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/InstanceFieldReadAbstractFunction.java
@@ -69,8 +69,8 @@
   }
 
   @Override
-  public boolean hasSingleInFlow() {
-    return false;
+  public boolean usesFlowGraphStateProvider() {
+    return true;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java
index e17e5b6..a39b534 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InFlowPropagatorDebugUtils.java
@@ -84,16 +84,14 @@
       FlowGraphStateProvider flowGraphStateProvider) {
     if (successorNode.getDebug()) {
       List<String> transferFunctionDependencies = new ArrayList<>();
-      if (!transferFunction.hasSingleInFlow()) {
-        transferFunctionDependencies.add("");
-        transferFunctionDependencies.add("TRANSFER FN INPUTS:");
-        for (BaseInFlow transferFunctionDependency : transferFunction.getBaseInFlow()) {
-          if (!node.equalsBaseInFlow(transferFunctionDependency)) {
-            ValueState transferFunctionDependencyState =
-                flowGraphStateProvider.getState(transferFunctionDependency, null);
-            transferFunctionDependencies.add("  DEP: " + transferFunctionDependency);
-            transferFunctionDependencies.add("  DEP STATE: " + transferFunctionDependencyState);
-          }
+      transferFunctionDependencies.add("");
+      transferFunctionDependencies.add("TRANSFER FN INPUTS:");
+      for (BaseInFlow transferFunctionDependency : transferFunction.getBaseInFlow()) {
+        if (!node.equalsBaseInFlow(transferFunctionDependency)) {
+          ValueState transferFunctionDependencyState =
+              flowGraphStateProvider.getState(transferFunctionDependency, null);
+          transferFunctionDependencies.add("  DEP: " + transferFunctionDependency);
+          transferFunctionDependencies.add("  DEP STATE: " + transferFunctionDependencyState);
         }
       }
       ValueState newSuccessorState = successorNode.getState();