Refactor argument propagation to use RewrittenPrototypeDescription

Change-Id: I23aec3843824eb7cc6b3c45e1cd090e334dd087d
diff --git a/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java b/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java
index 1133b65..3c1f6e0 100644
--- a/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java
+++ b/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java
@@ -477,7 +477,7 @@
     assert !isEmpty();
   }
 
-  private static RewrittenPrototypeDescription create(
+  public static RewrittenPrototypeDescription create(
       List<ExtraParameter> extraParameters,
       RewrittenTypeInfo rewrittenReturnInfo,
       ArgumentInfoCollection argumentsInfo) {
@@ -507,6 +507,11 @@
     return NONE;
   }
 
+  public Consumer<DexEncodedMethod.Builder> createParameterAnnotationsRemover(
+      DexEncodedMethod method) {
+    return getArgumentInfoCollection().createParameterAnnotationsRemover(method);
+  }
+
   public MethodOptimizationInfoFixer createMethodOptimizationInfoFixer() {
     return new RewrittenPrototypeDescriptionMethodOptimizationInfoFixer(this);
   }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
index beb3003..890cb48 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorApplicationFixer.java
@@ -8,7 +8,7 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.MethodCollection;
-import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection;
+import com.android.tools.r8.graph.RewrittenPrototypeDescription;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
@@ -66,12 +66,12 @@
           return method.toTypeSubstitutedMethod(
               methodReferenceAfterParameterRemoval,
               builder -> {
-                ArgumentInfoCollection removedParameters =
-                    graphLens.getRemovedParameters(methodReferenceAfterParameterRemoval);
+                RewrittenPrototypeDescription prototypeChanges =
+                    graphLens.getPrototypeChanges(methodReferenceAfterParameterRemoval);
                 builder
-                    .apply(removedParameters.createParameterAnnotationsRemover(method))
+                    .apply(prototypeChanges.createParameterAnnotationsRemover(method))
                     .fixupOptimizationInfo(
-                        appView, removedParameters.createMethodOptimizationInfoFixer());
+                        appView, prototypeChanges.createMethodOptimizationInfoFixer());
               });
         });
   }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
index a00c016..c3fe41b 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorGraphLens.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.NestedGraphLens;
 import com.android.tools.r8.graph.RewrittenPrototypeDescription;
-import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.collections.BidirectionalOneToOneHashMap;
 import com.android.tools.r8.utils.collections.BidirectionalOneToOneMap;
@@ -18,23 +17,23 @@
 
 public class ArgumentPropagatorGraphLens extends NestedGraphLens {
 
-  private final Map<DexMethod, ArgumentInfoCollection> removedParameters;
+  private final Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges;
 
   ArgumentPropagatorGraphLens(
       AppView<AppInfoWithLiveness> appView,
       BidirectionalOneToOneMap<DexMethod, DexMethod> methodMap,
-      Map<DexMethod, ArgumentInfoCollection> removedParameters) {
+      Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges) {
     super(appView, EMPTY_FIELD_MAP, methodMap, EMPTY_TYPE_MAP);
-    this.removedParameters = removedParameters;
+    this.prototypeChanges = prototypeChanges;
   }
 
   public static Builder builder(AppView<AppInfoWithLiveness> appView) {
     return new Builder(appView);
   }
 
-  public ArgumentInfoCollection getRemovedParameters(DexMethod method) {
+  public RewrittenPrototypeDescription getPrototypeChanges(DexMethod method) {
     assert method != internalGetPreviousMethodSignature(method);
-    return removedParameters.getOrDefault(method, ArgumentInfoCollection.empty());
+    return prototypeChanges.getOrDefault(method, RewrittenPrototypeDescription.none());
   }
 
   @Override
@@ -42,10 +41,10 @@
       RewrittenPrototypeDescription prototypeChanges, DexMethod method) {
     DexMethod previous = internalGetPreviousMethodSignature(method);
     if (previous == method) {
-      assert !removedParameters.containsKey(method);
+      assert !this.prototypeChanges.containsKey(method);
       return prototypeChanges;
     }
-    return prototypeChanges.withRemovedArguments(getRemovedParameters(method));
+    return prototypeChanges.combine(getPrototypeChanges(method));
   }
 
   @Override
@@ -63,7 +62,7 @@
     private final AppView<AppInfoWithLiveness> appView;
     private final MutableBidirectionalOneToOneMap<DexMethod, DexMethod> newMethodSignatures =
         new BidirectionalOneToOneHashMap<>();
-    private final Map<DexMethod, ArgumentInfoCollection> removedParameters =
+    private final Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges =
         new IdentityHashMap<>();
 
     Builder(AppView<AppInfoWithLiveness> appView) {
@@ -77,16 +76,16 @@
     public ArgumentPropagatorGraphLens.Builder mergeDisjoint(
         ArgumentPropagatorGraphLens.Builder partialGraphLensBuilder) {
       newMethodSignatures.putAll(partialGraphLensBuilder.newMethodSignatures);
-      removedParameters.putAll(partialGraphLensBuilder.removedParameters);
+      prototypeChanges.putAll(partialGraphLensBuilder.prototypeChanges);
       return this;
     }
 
     public Builder recordMove(
-        DexMethod from, DexMethod to, ArgumentInfoCollection removedParametersForMethod) {
+        DexMethod from, DexMethod to, RewrittenPrototypeDescription prototypeChangesForMethod) {
       assert from != to;
       newMethodSignatures.put(from, to);
-      if (!removedParametersForMethod.isEmpty()) {
-        removedParameters.put(to, removedParametersForMethod);
+      if (!prototypeChangesForMethod.isEmpty()) {
+        prototypeChanges.put(to, prototypeChangesForMethod);
       }
       return this;
     }
@@ -94,7 +93,7 @@
     public ArgumentPropagatorGraphLens build() {
       return isEmpty()
           ? null
-          : new ArgumentPropagatorGraphLens(appView, newMethodSignatures, removedParameters);
+          : new ArgumentPropagatorGraphLens(appView, newMethodSignatures, prototypeChanges);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
index 8d83dd6..483f6c4 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.graph.ImmediateProgramSubtypingInfo;
 import com.android.tools.r8.graph.ObjectAllocationInfoCollection;
 import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.RewrittenPrototypeDescription;
 import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection;
 import com.android.tools.r8.graph.RewrittenPrototypeDescription.RemovedArgumentInfo;
 import com.android.tools.r8.ir.analysis.value.AbstractValue;
@@ -313,15 +314,15 @@
       clazz.forEachProgramInstanceInitializer(instanceInitializerSignatures::add);
       clazz.forEachProgramMethod(
           method -> {
-            ArgumentInfoCollection removableParameters =
+            RewrittenPrototypeDescription prototypeChanges =
                 method.getDefinition().belongsToDirectPool()
                     ? computeRemovableParametersFromDirectMethod(
                         method, instanceInitializerSignatures)
                     : computeRemovableParametersFromVirtualMethod(method);
-            DexMethod newMethodSignature = getNewMethodSignature(method, removableParameters);
+            DexMethod newMethodSignature = getNewMethodSignature(method, prototypeChanges);
             if (newMethodSignature != method.getReference()) {
               partialGraphLensBuilder.recordMove(
-                  method.getReference(), newMethodSignature, removableParameters);
+                  method.getReference(), newMethodSignature, prototypeChanges);
               affected.set();
             }
           });
@@ -329,9 +330,9 @@
     }
 
     private DexMethod getNewMethodSignature(
-        ProgramMethod method, ArgumentInfoCollection removableParameters) {
+        ProgramMethod method, RewrittenPrototypeDescription prototypeChanges) {
       DexMethodSignature methodSignatureWithoutParametersRemoved = method.getMethodSignature();
-      IntSet removableParameterIndices = removableParameters.getKeys();
+      IntSet removableParameterIndices = prototypeChanges.getArgumentInfoCollection().getKeys();
 
       // Check if there is a reserved signature for this already.
       DexMethodSignature reservedSignature =
@@ -343,7 +344,7 @@
       }
 
       DexMethod methodReferenceWithParametersRemoved =
-          removableParameters.rewriteMethod(method, dexItemFactory);
+          prototypeChanges.getArgumentInfoCollection().rewriteMethod(method, dexItemFactory);
       DexMethodSignature methodSignatureWithParametersRemoved =
           methodReferenceWithParametersRemoved.getSignature();
 
@@ -395,40 +396,41 @@
       return newMethod;
     }
 
-    private ArgumentInfoCollection computeRemovableParametersFromDirectMethod(
+    private RewrittenPrototypeDescription computeRemovableParametersFromDirectMethod(
         ProgramMethod method, DexMethodSignatureSet instanceInitializerSignatures) {
       assert method.getDefinition().belongsToDirectPool();
       if (!isParameterRemovalAllowed(method)) {
-        return ArgumentInfoCollection.empty();
+        return RewrittenPrototypeDescription.none();
       }
       // TODO(b/199864962): Allow parameter removal from check-not-null classified methods.
       if (method
           .getOptimizationInfo()
           .getEnumUnboxerMethodClassification()
           .isCheckNotNullClassification()) {
-        return ArgumentInfoCollection.empty();
+        return RewrittenPrototypeDescription.none();
       }
-      ArgumentInfoCollection removableParameters = computeRemovableParametersFromMethod(method);
-      if (removableParameters.isEmpty()) {
-        return removableParameters;
+      RewrittenPrototypeDescription prototypeChanges = computePrototypeChangesForMethod(method);
+      if (prototypeChanges.isEmpty()) {
+        return prototypeChanges;
       }
       if (method.getDefinition().isInstanceInitializer()) {
-        DexMethod rewrittenMethod = removableParameters.rewriteMethod(method, dexItemFactory);
+        DexMethod rewrittenMethod =
+            prototypeChanges.getArgumentInfoCollection().rewriteMethod(method, dexItemFactory);
         assert rewrittenMethod != method.getReference();
         if (!instanceInitializerSignatures.add(rewrittenMethod)) {
-          return ArgumentInfoCollection.empty();
+          return RewrittenPrototypeDescription.none();
         }
       }
-      return removableParameters;
+      return prototypeChanges;
     }
 
-    private ArgumentInfoCollection computeRemovableParametersFromVirtualMethod(
+    private RewrittenPrototypeDescription computeRemovableParametersFromVirtualMethod(
         ProgramMethod method) {
       IntSet removableParameterIndices =
           removableVirtualMethodParameters.getOrDefault(
               method.getMethodSignature(), IntSets.EMPTY_SET);
       if (removableParameterIndices.isEmpty()) {
-        return ArgumentInfoCollection.empty();
+        return RewrittenPrototypeDescription.none();
       }
 
       if (method.getAccessFlags().isAbstract()) {
@@ -442,25 +444,27 @@
                   .setType(method.getArgumentType(removableParameterIndex))
                   .build());
         }
-        return removableParametersBuilder.build();
+        return RewrittenPrototypeDescription.create(
+            Collections.emptyList(), null, removableParametersBuilder.build());
       }
 
-      ArgumentInfoCollection removableParameters =
-          computeRemovableParametersFromMethod(method, removableParameterIndices::contains);
-      assert removableParameters.size() == removableParameterIndices.size();
-      return removableParameters;
+      RewrittenPrototypeDescription prototypeChanges =
+          computePrototypeChangesForMethod(method, removableParameterIndices::contains);
+      assert prototypeChanges.getArgumentInfoCollection().size()
+          == removableParameterIndices.size();
+      return prototypeChanges;
     }
 
-    private ArgumentInfoCollection computeRemovableParametersFromMethod(ProgramMethod method) {
-      return computeRemovableParametersFromMethod(method, parameterIndex -> true);
+    private RewrittenPrototypeDescription computePrototypeChangesForMethod(ProgramMethod method) {
+      return computePrototypeChangesForMethod(method, parameterIndex -> true);
     }
 
-    private ArgumentInfoCollection computeRemovableParametersFromMethod(
+    private RewrittenPrototypeDescription computePrototypeChangesForMethod(
         ProgramMethod method, IntPredicate removableParameterIndices) {
       ConcreteCallSiteOptimizationInfo optimizationInfo =
           method.getDefinition().getCallSiteOptimizationInfo().asConcreteCallSiteOptimizationInfo();
       if (optimizationInfo == null) {
-        return ArgumentInfoCollection.empty();
+        return RewrittenPrototypeDescription.none();
       }
 
       ArgumentInfoCollection.Builder removableParametersBuilder = ArgumentInfoCollection.builder();
@@ -481,7 +485,8 @@
                   .build());
         }
       }
-      return removableParametersBuilder.build();
+      return RewrittenPrototypeDescription.create(
+          Collections.emptyList(), null, removableParametersBuilder.build());
     }
   }
 }