Minor cleanup of optimization info rewrite
Change-Id: Idbda66117a4887d5315a9f990083cfdac28f5db9
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
index f33a1d4..caca28e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
@@ -134,10 +134,10 @@
@Override
public ArrayTypeElement fixupClassTypeReferences(
- Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+ AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
if (memberTypeLattice.isReferenceType()) {
TypeElement substitutedMemberType =
- memberTypeLattice.fixupClassTypeReferences(mapping, appView);
+ memberTypeLattice.fixupClassTypeReferences(appView, mapping);
if (substitutedMemberType != memberTypeLattice) {
return ArrayTypeElement.create(substitutedMemberType, nullability);
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
index 144f465..e1a924c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ClassTypeElement.java
@@ -156,7 +156,7 @@
@Override
public TypeElement fixupClassTypeReferences(
- Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+ AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
DexType mappedType = mapping.apply(type);
if (mappedType.isPrimitiveType()) {
return PrimitiveTypeElement.fromDexType(mappedType, false);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
index a89c486..88d8b66 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
@@ -85,7 +85,7 @@
|| operandType.isPrimitiveType()
|| operandType.isNullType()
|| (operandType.isReferenceType()
- && operandType.fixupClassTypeReferences(mapping, appView) == operandType);
+ && operandType.fixupClassTypeReferences(appView, mapping) == operandType);
}
}
}
@@ -98,7 +98,7 @@
BasicBlock block = blocks.next();
for (Phi phi : block.getPhis()) {
TypeElement phiType = phi.getType();
- TypeElement substituted = phiType.fixupClassTypeReferences(mapping, appView);
+ TypeElement substituted = phiType.fixupClassTypeReferences(appView, mapping);
assert substituted == phiType || affectedPhis.contains(phi);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
index 9736b13..ecc466a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeElement.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.ir.code.Value;
import java.util.function.Function;
@@ -68,10 +69,15 @@
}
public TypeElement fixupClassTypeReferences(
- Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+ AppView<? extends AppInfoWithClassHierarchy> appView, Function<DexType, DexType> mapping) {
return this;
}
+ public final TypeElement rewrittenWithLens(
+ AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens graphLens) {
+ return fixupClassTypeReferences(appView, graphLens::lookupType);
+ }
+
public boolean isNullable() {
return nullability().isNullable();
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 66e7ff7..b02d5e7 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -122,8 +122,7 @@
private Value makeOutValue(Instruction insn, IRCode code) {
if (insn.outValue() != null) {
TypeElement oldType = insn.getOutType();
- TypeElement newType =
- oldType.fixupClassTypeReferences(appView.graphLens()::lookupType, appView);
+ TypeElement newType = oldType.rewrittenWithLens(appView, appView.graphLens());
return code.createValue(newType, insn.getLocalInfo());
}
return null;
@@ -622,8 +621,7 @@
Assume assume = current.asAssume();
if (assume.hasOutValue()) {
TypeElement type = assume.getOutType();
- TypeElement substituted =
- type.fixupClassTypeReferences(graphLens::lookupType, appView);
+ TypeElement substituted = type.rewrittenWithLens(appView, graphLens);
if (substituted != type) {
assert type.isArrayType() || type.isClassType();
if (substituted.isPrimitiveType()) {
@@ -659,8 +657,7 @@
if (current.hasOutValue()) {
// For all other instructions, substitute any changed type.
TypeElement type = current.getOutType();
- TypeElement substituted =
- type.fixupClassTypeReferences(graphLens::lookupType, appView);
+ TypeElement substituted = type.rewrittenWithLens(appView, graphLens);
if (substituted != type) {
current.outValue().setType(substituted);
affectedPhis.addAll(current.outValue().uniquePhiUsers());
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index 5afd25d..b637199 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -77,8 +77,7 @@
import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldOrdinalData;
import com.android.tools.r8.ir.optimize.enums.EnumInstanceFieldData.EnumInstanceFieldUnknownData;
import com.android.tools.r8.ir.optimize.enums.eligibility.Reason;
-import com.android.tools.r8.ir.optimize.info.FieldOptimizationInfo;
-import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MutableFieldOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback.OptimizationInfoFixer;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
import com.android.tools.r8.ir.optimize.info.UpdatableMethodOptimizationInfo;
@@ -469,31 +468,20 @@
executorService,
new OptimizationInfoFixer() {
@Override
- public void fixup(DexEncodedField field) {
- FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
- if (optimizationInfo.isMutableFieldOptimizationInfo()) {
- optimizationInfo
- .asMutableFieldOptimizationInfo()
- .fixupClassTypeReferences(appView.graphLens()::lookupType, appView)
- .fixupAbstractValue(appView, appView.graphLens());
- } else {
- assert optimizationInfo.isDefaultFieldOptimizationInfo();
- }
+ public void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo) {
+ optimizationInfo
+ .asMutableFieldOptimizationInfo()
+ .fixupClassTypeReferences(appView, appView.graphLens())
+ .fixupAbstractValue(appView, appView.graphLens());
}
@Override
- public void fixup(DexEncodedMethod method) {
- MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
- if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
- UpdatableMethodOptimizationInfo updatableOptimizationInfo =
- optimizationInfo.asUpdatableMethodOptimizationInfo();
- updatableOptimizationInfo
- .fixupClassTypeReferences(appView.graphLens()::lookupType, appView)
- .fixupAbstractReturnValue(appView, appView.graphLens())
- .fixupInstanceInitializerInfo(appView, appView.graphLens());
- } else {
- assert optimizationInfo.isDefaultMethodOptimizationInfo();
- }
+ public void fixup(
+ DexEncodedMethod method, UpdatableMethodOptimizationInfo optimizationInfo) {
+ optimizationInfo
+ .fixupClassTypeReferences(appView, appView.graphLens())
+ .fixupAbstractReturnValue(appView, appView.graphLens())
+ .fixupInstanceInitializerInfo(appView, appView.graphLens());
}
});
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
index 41ee658..b2f291a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -6,14 +6,12 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.UnknownValue;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import java.util.function.Function;
/**
* Optimization info for fields.
@@ -35,13 +33,13 @@
private TypeElement dynamicUpperBoundType = null;
public MutableFieldOptimizationInfo fixupClassTypeReferences(
- Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+ AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens lens) {
if (dynamicUpperBoundType != null) {
- dynamicUpperBoundType = dynamicUpperBoundType.fixupClassTypeReferences(mapping, appView);
+ dynamicUpperBoundType = dynamicUpperBoundType.rewrittenWithLens(appView, lens);
}
if (dynamicLowerBoundType != null) {
TypeElement dynamicLowerBoundType =
- this.dynamicLowerBoundType.fixupClassTypeReferences(mapping, appView);
+ this.dynamicLowerBoundType.rewrittenWithLens(appView, lens);
if (dynamicLowerBoundType.isClassType()) {
this.dynamicLowerBoundType = dynamicLowerBoundType.asClassType();
} else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
index 46cff7b..256f80a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
@@ -20,9 +20,9 @@
public interface OptimizationInfoFixer {
- void fixup(DexEncodedField field);
+ void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo);
- void fixup(DexEncodedMethod method);
+ void fixup(DexEncodedMethod method, UpdatableMethodOptimizationInfo optimizationInfo);
}
public void fixupOptimizationInfos(
@@ -31,8 +31,22 @@
ThreadUtils.processItems(
appView.appInfo().classes(),
clazz -> {
- clazz.fields().forEach(fixer::fixup);
- clazz.methods().forEach(fixer::fixup);
+ for (DexEncodedField field : clazz.fields()) {
+ FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
+ if (optimizationInfo.isMutableFieldOptimizationInfo()) {
+ fixer.fixup(field, optimizationInfo.asMutableFieldOptimizationInfo());
+ } else {
+ assert optimizationInfo.isDefaultFieldOptimizationInfo();
+ }
+ }
+ for (DexEncodedMethod method : clazz.methods()) {
+ MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
+ if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
+ fixer.fixup(method, optimizationInfo.asUpdatableMethodOptimizationInfo());
+ } else {
+ assert optimizationInfo.isDefaultMethodOptimizationInfo();
+ }
+ }
},
executorService);
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
index d6bdd6b..e33f49c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
@@ -23,7 +23,6 @@
import com.android.tools.r8.utils.BooleanUtils;
import java.util.BitSet;
import java.util.Set;
-import java.util.function.Function;
public class UpdatableMethodOptimizationInfo extends MethodOptimizationInfo {
@@ -147,14 +146,14 @@
}
public UpdatableMethodOptimizationInfo fixupClassTypeReferences(
- Function<DexType, DexType> mapping, AppView<? extends AppInfoWithClassHierarchy> appView) {
+ AppView<? extends AppInfoWithClassHierarchy> appView, GraphLens lens) {
if (returnsObjectWithUpperBoundType != null) {
returnsObjectWithUpperBoundType =
- returnsObjectWithUpperBoundType.fixupClassTypeReferences(mapping, appView);
+ returnsObjectWithUpperBoundType.rewrittenWithLens(appView, lens);
}
if (returnsObjectWithLowerBoundType != null) {
TypeElement returnsObjectWithLowerBoundType =
- this.returnsObjectWithLowerBoundType.fixupClassTypeReferences(mapping, appView);
+ this.returnsObjectWithLowerBoundType.rewrittenWithLens(appView, lens);
if (returnsObjectWithLowerBoundType.isClassType()) {
this.returnsObjectWithLowerBoundType = returnsObjectWithLowerBoundType.asClassType();
} else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
index 262671f..708c84a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
@@ -62,12 +62,9 @@
}
return new InstanceFieldTypeInitializationInfo(
dynamicLowerBoundType != null
- ? dynamicLowerBoundType
- .fixupClassTypeReferences(lens::lookupType, appView.withClassHierarchy())
- .asClassType()
+ ? dynamicLowerBoundType.rewrittenWithLens(appView, lens).asClassType()
: null,
- dynamicUpperBoundType.fixupClassTypeReferences(
- lens::lookupType, appView.withClassHierarchy()));
+ dynamicUpperBoundType.rewrittenWithLens(appView, lens));
}
@Override