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;