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());
}
}
}