Bound the number of in-flow constraints in argument propagation

Fixes: 190154391
Change-Id: Ib74a017514fa2dfe26fa063ad35272519d8048f6
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 eb75ac9..9a9de09 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
@@ -106,7 +106,7 @@
       return unknown();
     }
     boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters()) {
+    if (widenInParameters(appView)) {
       return unknown();
     }
     if (inParametersChanged) {
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 02db24d..9af5fb3 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
@@ -123,7 +123,7 @@
       return unknown();
     }
     boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters()) {
+    if (widenInParameters(appView)) {
       return unknown();
     }
     if (abstractValue != oldAbstractValue
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 3b9da36..fb9451f 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
@@ -140,8 +140,13 @@
     return inParameters.addAll(parameterState.inParameters);
   }
 
-  boolean widenInParameters() {
-    // TODO(b/190154391): Widen to unknown when the size of the collection exceeds a threshold.
-    return false;
+  /**
+   * 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();
   }
 }
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 3f1baff..429e514 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
@@ -69,7 +69,7 @@
       return unknown();
     }
     boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters()) {
+    if (widenInParameters(appView)) {
       return unknown();
     }
     if (abstractValue != oldAbstractValue || inParametersChanged) {
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 d7f7bbc..74c9107 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
@@ -100,7 +100,7 @@
       return unknown();
     }
     boolean inParametersChanged = mutableJoinInParameters(parameterState);
-    if (widenInParameters()) {
+    if (widenInParameters(appView)) {
       return unknown();
     }
     if (!dynamicType.equals(oldDynamicType) || inParametersChanged) {
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 aa3eb2e..3718fcf 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1235,6 +1235,10 @@
       return maxNumberOfDispatchTargetsBeforeAbandoning;
     }
 
+    public int getMaxNumberOfInParameters() {
+      return 10;
+    }
+
     public boolean isEnabled() {
       if (!isOptimizing() || !isShrinking()) {
         return false;