Do not record in-flow for already unknown method paramters
Change-Id: Ibd8b9dbf25c0b8a5f4bcf0118229ffcca6569010
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 421271a..8fe8d8c 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
@@ -102,6 +102,24 @@
return virtualRootMethods.get(method.getReference());
}
+ boolean isMethodParameterAlreadyUnknown(MethodParameter methodParameter, ProgramMethod method) {
+ MethodState methodState =
+ methodStates.get(
+ method.getDefinition().belongsToDirectPool() || isMonomorphicVirtualMethod(method)
+ ? method.getReference()
+ : getVirtualRootMethod(method));
+ if (methodState.isPolymorphic()) {
+ methodState = methodState.asPolymorphic().getMethodStateForBounds(DynamicType.unknown());
+ }
+ if (methodState.isMonomorphic()) {
+ ParameterState parameterState =
+ methodState.asMonomorphic().getParameterState(methodParameter.getIndex());
+ return parameterState.isUnknown();
+ }
+ assert methodState.isBottom() || methodState.isUnknown();
+ return methodState.isUnknown();
+ }
+
boolean isMonomorphicVirtualMethod(ProgramMethod method) {
boolean isMonomorphicVirtualMethod = monomorphicVirtualMethods.contains(method.getReference());
assert method.getDefinition().belongsToVirtualPool() || !isMonomorphicVirtualMethod;
@@ -425,6 +443,9 @@
MethodParameter forwardedParameter =
methodParameterFactory.create(
context, argumentRoot.getDefinition().asArgument().getIndex());
+ if (isMethodParameterAlreadyUnknown(forwardedParameter, context)) {
+ return ParameterState.unknown();
+ }
if (parameterTypeElement.isClassType()) {
return new ConcreteClassTypeParameterState(forwardedParameter);
} else if (parameterTypeElement.isArrayType()) {