Canonicalize method parameters in argument propagator
Change-Id: Ibb3289fa97dddb57d52cad7b0112797d6bb8b4d5
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 6288a63..421271a 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
@@ -35,6 +35,7 @@
import com.android.tools.r8.optimize.argumentpropagation.codescanner.ConcretePrimitiveTypeParameterState;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.ConcreteReceiverParameterState;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodParameter;
+import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodParameterFactory;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodState;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodStateCollectionByReference;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.ParameterState;
@@ -63,6 +64,8 @@
private final AppView<AppInfoWithLiveness> appView;
+ private final MethodParameterFactory methodParameterFactory = new MethodParameterFactory();
+
private final Set<DexMethod> monomorphicVirtualMethods = Sets.newIdentityHashSet();
/**
@@ -420,8 +423,8 @@
// potentially called from this invoke instruction.
if (argumentRoot.isArgument()) {
MethodParameter forwardedParameter =
- new MethodParameter(
- context.getReference(), argumentRoot.getDefinition().asArgument().getIndex());
+ methodParameterFactory.create(
+ context, argumentRoot.getDefinition().asArgument().getIndex());
if (parameterTypeElement.isClassType()) {
return new ConcreteClassTypeParameterState(forwardedParameter);
} else if (parameterTypeElement.isArrayType()) {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/MethodParameterFactory.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/MethodParameterFactory.java
new file mode 100644
index 0000000..d1501e6
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/codescanner/MethodParameterFactory.java
@@ -0,0 +1,20 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.optimize.argumentpropagation.codescanner;
+
+import com.android.tools.r8.graph.ProgramMethod;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+
+public class MethodParameterFactory {
+
+ private final Map<MethodParameter, MethodParameter> methodParameters = new ConcurrentHashMap<>();
+
+ public MethodParameter create(ProgramMethod method, int argumentIndex) {
+ return methodParameters.computeIfAbsent(
+ new MethodParameter(method.getReference(), argumentIndex), Function.identity());
+ }
+}