diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorOptimizationInfoPopulator.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorOptimizationInfoPopulator.java
index 4a19396..6b05437 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorOptimizationInfoPopulator.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorOptimizationInfoPopulator.java
@@ -164,7 +164,7 @@
     assert monomorphicMethodState.getParameterStates().stream()
         .filter(ParameterState::isConcrete)
         .map(ParameterState::asConcrete)
-        .noneMatch(ConcreteParameterState::hasInParameters);
+        .noneMatch(ConcreteParameterState::hasInFlow);
 
     if (monomorphicMethodState.size() > 0) {
       getSimpleFeedback()
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomArrayTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomArrayTypeParameterState.java
index 3ba87ce..e3a242f 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomArrayTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomArrayTypeParameterState.java
@@ -44,7 +44,6 @@
     if (nullability.isMaybeNull()) {
       return unknown();
     }
-    return new ConcreteArrayTypeParameterState(
-        nullability, concreteParameterState.copyInParameters());
+    return new ConcreteArrayTypeParameterState(nullability, concreteParameterState.copyInFlow());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomClassTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomClassTypeParameterState.java
index 2ae85ed..2d4dd2b 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomClassTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomClassTypeParameterState.java
@@ -49,6 +49,6 @@
     return abstractValue.isUnknown() && widenedDynamicType.isUnknown()
         ? unknown()
         : new ConcreteClassTypeParameterState(
-            abstractValue, widenedDynamicType, concreteParameterState.copyInParameters());
+            abstractValue, widenedDynamicType, concreteParameterState.copyInFlow());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomReceiverParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomReceiverParameterState.java
index aa331f8..e9ef27f 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomReceiverParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/BottomReceiverParameterState.java
@@ -44,7 +44,6 @@
     if (dynamicType.isUnknown()) {
       return unknown();
     }
-    return new ConcreteReceiverParameterState(
-        dynamicType, concreteParameterState.copyInParameters());
+    return new ConcreteReceiverParameterState(dynamicType, concreteParameterState.copyInFlow());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteArrayTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteArrayTypeParameterState.java
index 801ada2..97803d0 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteArrayTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteArrayTypeParameterState.java
@@ -27,21 +27,20 @@
     this(nullability, Collections.emptySet());
   }
 
-  public ConcreteArrayTypeParameterState(
-      Nullability nullability, Set<MethodParameter> inParameters) {
-    super(inParameters);
+  public ConcreteArrayTypeParameterState(Nullability nullability, Set<MethodParameter> inFlow) {
+    super(inFlow);
     this.nullability = nullability;
     assert !isEffectivelyBottom() : "Must use BottomArrayTypeParameterState instead";
     assert !isEffectivelyUnknown() : "Must use UnknownParameterState instead";
   }
 
   @Override
-  public ParameterState clearInParameters() {
-    if (hasInParameters()) {
+  public ParameterState clearInFlow() {
+    if (hasInFlow()) {
       if (nullability.isBottom()) {
         return bottomArrayTypeParameter();
       }
-      internalClearInParameters();
+      internalClearInFlow();
     }
     assert !isEffectivelyBottom();
     return this;
@@ -81,7 +80,7 @@
   }
 
   public boolean isEffectivelyBottom() {
-    return nullability.isBottom() && !hasInParameters();
+    return nullability.isBottom() && !hasInFlow();
   }
 
   public boolean isEffectivelyUnknown() {
@@ -90,7 +89,7 @@
 
   @Override
   public ParameterState mutableCopy() {
-    return new ConcreteArrayTypeParameterState(nullability, copyInParameters());
+    return new ConcreteArrayTypeParameterState(nullability, copyInFlow());
   }
 
   @Override
@@ -105,11 +104,11 @@
     if (nullability.isUnknown()) {
       return unknown();
     }
-    boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters(appView)) {
+    boolean inFlowChanged = mutableJoinInFlow(parameterState);
+    if (widenInFlow(appView)) {
       return unknown();
     }
-    if (inParametersChanged) {
+    if (inFlowChanged) {
       onChangedAction.execute();
     }
     return this;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java
index 93683aa..5c6d7a4 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteClassTypeParameterState.java
@@ -30,8 +30,8 @@
   }
 
   public ConcreteClassTypeParameterState(
-      AbstractValue abstractValue, DynamicType dynamicType, Set<MethodParameter> inParameters) {
-    super(inParameters);
+      AbstractValue abstractValue, DynamicType dynamicType, Set<MethodParameter> inFlow) {
+    super(inFlow);
     this.abstractValue = abstractValue;
     this.dynamicType = dynamicType;
     assert !isEffectivelyBottom() : "Must use BottomClassTypeParameterState instead";
@@ -39,13 +39,13 @@
   }
 
   @Override
-  public ParameterState clearInParameters() {
-    if (hasInParameters()) {
+  public ParameterState clearInFlow() {
+    if (hasInFlow()) {
       if (abstractValue.isBottom()) {
         assert dynamicType.isBottom();
         return bottomClassTypeParameter();
       }
-      internalClearInParameters();
+      internalClearInFlow();
     }
     assert !isEffectivelyBottom();
     return this;
@@ -86,7 +86,7 @@
   }
 
   public boolean isEffectivelyBottom() {
-    return abstractValue.isBottom() && dynamicType.isBottom() && !hasInParameters();
+    return abstractValue.isBottom() && dynamicType.isBottom() && !hasInFlow();
   }
 
   public boolean isEffectivelyUnknown() {
@@ -95,7 +95,7 @@
 
   @Override
   public ParameterState mutableCopy() {
-    return new ConcreteClassTypeParameterState(abstractValue, dynamicType, copyInParameters());
+    return new ConcreteClassTypeParameterState(abstractValue, dynamicType, copyInFlow());
   }
 
   @Override
@@ -119,13 +119,11 @@
     if (abstractValue.isUnknown() && dynamicType.isUnknown()) {
       return unknown();
     }
-    boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters(appView)) {
+    boolean inFlowChanged = mutableJoinInFlow(parameterState);
+    if (widenInFlow(appView)) {
       return unknown();
     }
-    if (abstractValue != oldAbstractValue
-        || !dynamicType.equals(oldDynamicType)
-        || inParametersChanged) {
+    if (abstractValue != oldAbstractValue || !dynamicType.equals(oldDynamicType) || inFlowChanged) {
       onChangedAction.execute();
     }
     return this;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteParameterState.java
index ed3873f..4e95fed 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteParameterState.java
@@ -21,33 +21,33 @@
     RECEIVER
   }
 
-  private Set<MethodParameter> inParameters;
+  private Set<MethodParameter> inFlow;
 
-  ConcreteParameterState(Set<MethodParameter> inParameters) {
-    this.inParameters = inParameters;
+  ConcreteParameterState(Set<MethodParameter> inFlow) {
+    this.inFlow = inFlow;
   }
 
-  public abstract ParameterState clearInParameters();
+  public abstract ParameterState clearInFlow();
 
-  void internalClearInParameters() {
-    inParameters = Collections.emptySet();
+  void internalClearInFlow() {
+    inFlow = Collections.emptySet();
   }
 
-  public Set<MethodParameter> copyInParameters() {
-    if (inParameters.isEmpty()) {
-      assert inParameters == Collections.<MethodParameter>emptySet();
-      return inParameters;
+  public Set<MethodParameter> copyInFlow() {
+    if (inFlow.isEmpty()) {
+      assert inFlow == Collections.<MethodParameter>emptySet();
+      return inFlow;
     }
-    return new HashSet<>(inParameters);
+    return new HashSet<>(inFlow);
   }
 
-  public boolean hasInParameters() {
-    return !inParameters.isEmpty();
+  public boolean hasInFlow() {
+    return !inFlow.isEmpty();
   }
 
-  public Set<MethodParameter> getInParameters() {
-    assert inParameters.isEmpty() || inParameters instanceof HashSet<?>;
-    return inParameters;
+  public Set<MethodParameter> getInFlow() {
+    assert inFlow.isEmpty() || inFlow instanceof HashSet<?>;
+    return inFlow;
   }
 
   public abstract ConcreteParameterStateKind getKind();
@@ -130,24 +130,23 @@
             appView, concreteParameterState.asPrimitiveParameter(), parameterType, onChangedAction);
   }
 
-  boolean mutableJoinInParameters(ConcreteParameterState parameterState) {
-    if (parameterState.inParameters.isEmpty()) {
+  boolean mutableJoinInFlow(ConcreteParameterState parameterState) {
+    if (parameterState.inFlow.isEmpty()) {
       return false;
     }
-    if (inParameters.isEmpty()) {
-      assert inParameters == Collections.<MethodParameter>emptySet();
-      inParameters = new HashSet<>();
+    if (inFlow.isEmpty()) {
+      assert inFlow == Collections.<MethodParameter>emptySet();
+      inFlow = new HashSet<>();
     }
-    return inParameters.addAll(parameterState.inParameters);
+    return inFlow.addAll(parameterState.inFlow);
   }
 
   /**
    * Returns true if the in-parameters set should be widened to unknown, in which case the entire
    * parameter state must be widened to unknown.
    */
-  boolean widenInParameters(AppView<AppInfoWithLiveness> appView) {
-    return inParameters != null
-        && inParameters.size()
-            > appView.options().callSiteOptimizationOptions().getMaxNumberOfInParameters();
+  boolean widenInFlow(AppView<AppInfoWithLiveness> appView) {
+    return inFlow != null
+        && inFlow.size() > appView.options().callSiteOptimizationOptions().getMaxInFlowSize();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java
index c0fc006..6a90616 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcretePrimitiveTypeParameterState.java
@@ -22,8 +22,8 @@
   }
 
   public ConcretePrimitiveTypeParameterState(
-      AbstractValue abstractValue, Set<MethodParameter> inParameters) {
-    super(inParameters);
+      AbstractValue abstractValue, Set<MethodParameter> inFlow) {
+    super(inFlow);
     this.abstractValue = abstractValue;
     assert !isEffectivelyBottom() : "Must use BottomPrimitiveTypeParameterState instead";
     assert !isEffectivelyUnknown() : "Must use UnknownParameterState instead";
@@ -34,12 +34,12 @@
   }
 
   @Override
-  public ParameterState clearInParameters() {
-    if (hasInParameters()) {
+  public ParameterState clearInFlow() {
+    if (hasInFlow()) {
       if (abstractValue.isBottom()) {
         return bottomPrimitiveTypeParameter();
       }
-      internalClearInParameters();
+      internalClearInFlow();
     }
     assert !isEffectivelyBottom();
     return this;
@@ -47,7 +47,7 @@
 
   @Override
   public ParameterState mutableCopy() {
-    return new ConcretePrimitiveTypeParameterState(abstractValue, copyInParameters());
+    return new ConcretePrimitiveTypeParameterState(abstractValue, copyInFlow());
   }
 
   @SuppressWarnings("ReferenceEquality")
@@ -65,11 +65,11 @@
     if (abstractValue.isUnknown()) {
       return unknown();
     }
-    boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters(appView)) {
+    boolean inFlowChanged = mutableJoinInFlow(parameterState);
+    if (widenInFlow(appView)) {
       return unknown();
     }
-    if (abstractValue != oldAbstractValue || inParametersChanged) {
+    if (abstractValue != oldAbstractValue || inFlowChanged) {
       onChangedAction.execute();
     }
     return this;
@@ -86,7 +86,7 @@
   }
 
   public boolean isEffectivelyBottom() {
-    return abstractValue.isBottom() && !hasInParameters();
+    return abstractValue.isBottom() && !hasInFlow();
   }
 
   public boolean isEffectivelyUnknown() {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReceiverParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReceiverParameterState.java
index 4da32d6..5a321a3 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReceiverParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReceiverParameterState.java
@@ -22,21 +22,20 @@
     this(dynamicType, Collections.emptySet());
   }
 
-  public ConcreteReceiverParameterState(
-      DynamicType dynamicType, Set<MethodParameter> inParameters) {
-    super(inParameters);
+  public ConcreteReceiverParameterState(DynamicType dynamicType, Set<MethodParameter> inFlow) {
+    super(inFlow);
     this.dynamicType = dynamicType;
     assert !isEffectivelyBottom() : "Must use BottomReceiverParameterState instead";
     assert !isEffectivelyUnknown() : "Must use UnknownParameterState instead";
   }
 
   @Override
-  public ParameterState clearInParameters() {
-    if (hasInParameters()) {
+  public ParameterState clearInFlow() {
+    if (hasInFlow()) {
       if (dynamicType.isBottom()) {
         return bottomReceiverParameter();
       }
-      internalClearInParameters();
+      internalClearInFlow();
     }
     assert !isEffectivelyBottom();
     return this;
@@ -63,7 +62,7 @@
   }
 
   public boolean isEffectivelyBottom() {
-    return dynamicType.isBottom() && !hasInParameters();
+    return dynamicType.isBottom() && !hasInFlow();
   }
 
   public boolean isEffectivelyUnknown() {
@@ -82,7 +81,7 @@
 
   @Override
   public ParameterState mutableCopy() {
-    return new ConcreteReceiverParameterState(dynamicType, copyInParameters());
+    return new ConcreteReceiverParameterState(dynamicType, copyInFlow());
   }
 
   @Override
@@ -99,11 +98,11 @@
     if (dynamicType.isUnknown()) {
       return unknown();
     }
-    boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters(appView)) {
+    boolean inFlowChanged = mutableJoinInFlow(parameterState);
+    if (widenInFlow(appView)) {
       return unknown();
     }
-    if (!dynamicType.equals(oldDynamicType) || inParametersChanged) {
+    if (!dynamicType.equals(oldDynamicType) || inFlowChanged) {
       onChangedAction.execute();
     }
     return this;
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReferenceTypeParameterState.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReferenceTypeParameterState.java
index 30506a0..da2056a 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReferenceTypeParameterState.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/ConcreteReferenceTypeParameterState.java
@@ -14,8 +14,8 @@
 
 public abstract class ConcreteReferenceTypeParameterState extends ConcreteParameterState {
 
-  ConcreteReferenceTypeParameterState(Set<MethodParameter> inParameters) {
-    super(inParameters);
+  ConcreteReferenceTypeParameterState(Set<MethodParameter> inFlow) {
+    super(inFlow);
   }
 
   public abstract DynamicType getDynamicType();
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InParameterFlowPropagator.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InParameterFlowPropagator.java
index c9794f5..ff0bd01 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InParameterFlowPropagator.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/propagation/InParameterFlowPropagator.java
@@ -203,12 +203,12 @@
 
       // No need to create a node for a parameter that doesn't depend on any other parameters
       // (unless some other parameter depends on this parameter).
-      if (!concreteParameterState.hasInParameters()) {
+      if (!concreteParameterState.hasInFlow()) {
         return;
       }
 
       ParameterNode node = getOrCreateParameterNode(method, parameterIndex, methodState);
-      for (MethodParameter inParameter : concreteParameterState.getInParameters()) {
+      for (MethodParameter inParameter : concreteParameterState.getInFlow()) {
         ProgramMethod enclosingMethod = getEnclosingMethod(inParameter);
         if (enclosingMethod == null) {
           // This is a parameter of a single caller inlined method. Since this method has been
@@ -247,7 +247,7 @@
 
       if (!node.getState().isUnknown()) {
         assert node.getState() == concreteParameterState;
-        node.setState(concreteParameterState.clearInParameters());
+        node.setState(concreteParameterState.clearInFlow());
       }
     }
 
diff --git a/src/main/java/com/android/tools/r8/optimize/compose/ComposeMethodProcessor.java b/src/main/java/com/android/tools/r8/optimize/compose/ComposeMethodProcessor.java
index 8ee6237..319d053 100644
--- a/src/main/java/com/android/tools/r8/optimize/compose/ComposeMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/optimize/compose/ComposeMethodProcessor.java
@@ -107,7 +107,7 @@
         if (monomorphicMethodState.getParameterState(i).isConcrete()) {
           ConcreteParameterState concreteParameterState =
               monomorphicMethodState.getParameterState(i).asConcrete();
-          if (concreteParameterState.hasInParameters()) {
+          if (concreteParameterState.hasInFlow()) {
             monomorphicMethodState.setParameterState(i, ParameterState.unknown());
           }
         }
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index e0ba332..02e6e1d 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1647,7 +1647,7 @@
       enabled = false;
     }
 
-    public int getMaxNumberOfInParameters() {
+    public int getMaxInFlowSize() {
       return 10;
     }
 
