Rewrite SingleNullValue to SingleNumberValue after enum unboxing
Change-Id: I1fb4b462d2958fcf7a065935f8f3ad0e1bc4dfb1
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
index 839756a..8d767ad 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RemovedArgumentInfo.java
@@ -88,9 +88,11 @@
@SuppressWarnings("ReferenceEquality")
public RemovedArgumentInfo rewrittenWithLens(
AppView<AppInfoWithLiveness> appView, GraphLens graphLens, GraphLens codeLens) {
- SingleValue rewrittenSingleValue =
- hasSingleValue() ? singleValue.rewrittenWithLens(appView, graphLens, codeLens) : null;
DexType rewrittenType = graphLens.lookupType(type, codeLens);
+ SingleValue rewrittenSingleValue =
+ hasSingleValue()
+ ? singleValue.rewrittenWithLens(appView, rewrittenType, graphLens, codeLens)
+ : null;
if (rewrittenSingleValue != singleValue || rewrittenType != type) {
return new RemovedArgumentInfo(rewrittenSingleValue, rewrittenType);
}
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
index 7a1391c..ee7aa41 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RemovedReceiverInfo.java
@@ -26,9 +26,11 @@
@SuppressWarnings("ReferenceEquality")
public RemovedReceiverInfo rewrittenWithLens(
AppView<AppInfoWithLiveness> appView, GraphLens graphLens, GraphLens codeLens) {
- SingleValue rewrittenSingleValue =
- hasSingleValue() ? getSingleValue().rewrittenWithLens(appView, graphLens, codeLens) : null;
DexType rewrittenType = graphLens.lookupType(getType(), codeLens);
+ SingleValue rewrittenSingleValue =
+ hasSingleValue()
+ ? getSingleValue().rewrittenWithLens(appView, rewrittenType, graphLens, codeLens)
+ : null;
if (rewrittenSingleValue != getSingleValue() || rewrittenType != getType()) {
return new RemovedReceiverInfo(rewrittenSingleValue, rewrittenType);
}
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
index cde2daf..af66b41 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
@@ -175,7 +175,7 @@
SingleValue rewrittenSingleValue =
rewrittenReturnInfo
.getSingleValue()
- .rewrittenWithLens(appView, appView.graphLens(), codeLens);
+ .rewrittenWithLens(appView, method.getReturnType(), appView.graphLens(), codeLens);
assert rewrittenSingleValue.isMaterializableInContext(appView, method);
return true;
}
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java b/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
index 8537d1d..fb10019 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RewrittenTypeInfo.java
@@ -97,7 +97,9 @@
DexType rewrittenCastType = castType != null ? graphLens.lookupType(castType, codeLens) : null;
DexType rewrittenNewType = graphLens.lookupType(newType, codeLens);
SingleValue rewrittenSingleValue =
- hasSingleValue() ? getSingleValue().rewrittenWithLens(appView, graphLens, codeLens) : null;
+ hasSingleValue()
+ ? getSingleValue().rewrittenWithLens(appView, rewrittenNewType, graphLens, codeLens)
+ : null;
if (rewrittenCastType != castType
|| rewrittenNewType != newType
|| rewrittenSingleValue != singleValue) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java
index e0a8917..a831c7e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.objectstate.ObjectState;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -197,7 +198,7 @@
}
public abstract AbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens);
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens);
@Override
public abstract boolean equals(Object o);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java
index 0653a7c..f5875b0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -25,7 +26,7 @@
@Override
public AbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/DefiniteBitsNumberValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/DefiniteBitsNumberValue.java
index 83ea1a0..778e61b 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/DefiniteBitsNumberValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/DefiniteBitsNumberValue.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.OptionalBool;
@@ -114,7 +115,7 @@
@Override
public AbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java
index 875943f..6eaf130 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NullOrAbstractValue.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -44,8 +45,8 @@
@Override
public NullOrAbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
- return new NullOrAbstractValue(value.rewrittenWithLens(appView, lens, codeLens));
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
+ return new NullOrAbstractValue(value.rewrittenWithLens(appView, newType, lens, codeLens));
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java
index 9581c42..161f1a1 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromIntervalValue.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.OptionalBool;
@@ -87,7 +88,7 @@
@Override
public AbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java
index c8b198b..6678c17 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NumberFromSetValue.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.ArrayUtils;
@@ -103,7 +104,7 @@
@Override
public AbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
index d5047ac..ebe0e66 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
@@ -128,7 +128,7 @@
@Override
@SuppressWarnings("ReferenceEquality")
public SingleValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
assert lens.lookupType(type, codeLens) == type;
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
index c5f258a..e75ea41 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleDexItemBasedStringValue.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexReference;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
@@ -116,7 +117,7 @@
@Override
public SingleValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return appView
.abstractValueFactory()
.createSingleDexItemBasedStringValue(
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
index 0c11a86..05d232e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -144,7 +144,7 @@
@Override
@SuppressWarnings("ReferenceEquality")
public SingleValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
AbstractValueFactory factory = appView.abstractValueFactory();
EnumDataMap enumDataMap = appView.unboxedEnums();
if (enumDataMap.hasUnboxedValueFor(field)) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNullValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNullValue.java
index 13358a2..eb49ec6 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNullValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNullValue.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
@@ -80,7 +81,11 @@
@Override
public SingleValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
+ if (newType.isIntType()) {
+ // Enum unboxing.
+ return appView.abstractValueFactory().createZeroValue();
+ }
return this;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
index a5b1151..c76a0db 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
@@ -180,7 +181,7 @@
@Override
public SingleValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return this;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
index 78e547c..ff503f2 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
@@ -102,7 +103,7 @@
@Override
public SingleValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return this;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
index 51bc690..ba1dab9 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
@@ -6,6 +6,7 @@
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.ProgramMethod;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.code.IRCode;
@@ -63,5 +64,5 @@
@Override
public abstract SingleValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens);
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens);
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java
index 25deb94..e735de5 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/StatefulObjectValue.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.value.objectstate.ObjectState;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -51,7 +52,7 @@
@Override
public AbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return create(getObjectState().rewrittenWithLens(appView, lens, codeLens));
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java
index e2ef4e0..990afee 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.analysis.value;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -30,7 +31,7 @@
@Override
public AbstractValue rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java
index e5f5b5e..3b73b9d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/objectstate/NonEmptyObjectState.java
@@ -46,10 +46,12 @@
AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
Map<DexField, AbstractValue> rewrittenState = new IdentityHashMap<>();
state.forEach(
- (field, value) ->
- rewrittenState.put(
- lens.lookupField(field, codeLens),
- value.rewrittenWithLens(appView, lens, codeLens)));
+ (field, value) -> {
+ DexField rewrittenField = lens.lookupField(field, codeLens);
+ rewrittenState.put(
+ rewrittenField,
+ value.rewrittenWithLens(appView, rewrittenField.getType(), lens, codeLens));
+ });
return new NonEmptyObjectState(rewrittenState);
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
index 1eb9c3d..20a8df6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -798,7 +798,7 @@
@Override
public void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo) {
optimizationInfo
- .fixupAbstractValue(appView, graphLens, codeLens)
+ .fixupAbstractValue(appView, field, graphLens, codeLens)
.fixupClassTypeReferences(appView, graphLens);
}
@@ -820,7 +820,7 @@
}
})
.fixupClassTypeReferences(appView, graphLens)
- .fixupAbstractReturnValue(appView, graphLens, codeLens)
+ .fixupAbstractReturnValue(appView, method, graphLens, codeLens)
.fixupInstanceInitializerInfo(
appView, graphLens, codeLens, treeFixerResult.getPrunedItems());
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/LibraryOptimizationInfoInitializerFeedback.java b/src/main/java/com/android/tools/r8/ir/optimize/info/LibraryOptimizationInfoInitializerFeedback.java
index ace2aa6..90136f4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/LibraryOptimizationInfoInitializerFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/LibraryOptimizationInfoInitializerFeedback.java
@@ -4,9 +4,6 @@
package com.android.tools.r8.ir.optimize.info;
-import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.ir.analysis.value.AbstractValue;
-
public class LibraryOptimizationInfoInitializerFeedback extends OptimizationFeedbackSimple {
private static LibraryOptimizationInfoInitializerFeedback INSTANCE =
@@ -17,9 +14,4 @@
public static LibraryOptimizationInfoInitializerFeedback getInstance() {
return INSTANCE;
}
-
- public void recordLibraryFieldHasAbstractValue(
- DexEncodedField field, AbstractValue abstractValue) {
- field.getMutableOptimizationInfo().setAbstractValue(abstractValue);
- }
}
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 406aa24..4dc44df 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
@@ -7,6 +7,7 @@
import static java.util.Collections.emptySet;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.ir.analysis.type.DynamicType;
@@ -59,15 +60,26 @@
return abstractValue;
}
- void setAbstractValue(AbstractValue abstractValue) {
+ MutableFieldOptimizationInfo setAbstractValue(
+ AbstractValue abstractValue, DexEncodedField field) {
+ assert !abstractValue.isNull() || field.getType().isReferenceType();
+ assert !abstractValue.isSingleNumberValue() || field.getType().isPrimitiveType();
+ return setAbstractValue(abstractValue);
+ }
+
+ private MutableFieldOptimizationInfo setAbstractValue(AbstractValue abstractValue) {
assert getAbstractValue().isUnknown() || abstractValue.isNonTrivial();
this.abstractValue = abstractValue;
+ return this;
}
public MutableFieldOptimizationInfo fixupAbstractValue(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
- setAbstractValue(abstractValue.rewrittenWithLens(appView, lens, codeLens));
- return this;
+ AppView<AppInfoWithLiveness> appView,
+ DexEncodedField field,
+ GraphLens lens,
+ GraphLens codeLens) {
+ return setAbstractValue(
+ abstractValue.rewrittenWithLens(appView, field.getType(), lens, codeLens), field);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
index 009ef70..167bbdc 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
@@ -202,8 +202,12 @@
}
public MutableMethodOptimizationInfo fixupAbstractReturnValue(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
- abstractReturnValue = abstractReturnValue.rewrittenWithLens(appView, lens, codeLens);
+ AppView<AppInfoWithLiveness> appView,
+ DexEncodedMethod method,
+ GraphLens lens,
+ GraphLens codeLens) {
+ abstractReturnValue =
+ abstractReturnValue.rewrittenWithLens(appView, method.getReturnType(), lens, codeLens);
return this;
}
@@ -655,7 +659,13 @@
clearFlag(NEVER_RETURNS_NORMALLY_FLAG);
}
- public void markReturnsAbstractValue(AbstractValue value) {
+ void setAbstractReturnValue(AbstractValue value, DexEncodedMethod method) {
+ assert !value.isNull() || method.getReturnType().isReferenceType();
+ assert !value.isSingleNumberValue() || method.getReturnType().isPrimitiveType();
+ setAbstractReturnValue(value);
+ }
+
+ private void setAbstractReturnValue(AbstractValue value) {
assert !abstractReturnValue.isSingleValue() || abstractReturnValue.equals(value)
: "return single value changed from " + abstractReturnValue + " to " + value;
abstractReturnValue = value;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index bbb1cec..5999efb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -151,7 +151,7 @@
.get(field.getReference())
.hasReflectiveAccess();
if (appView.appInfo().mayPropagateValueFor(appView, field.getReference())) {
- getFieldOptimizationInfoForUpdating(field).setAbstractValue(abstractValue);
+ getFieldOptimizationInfoForUpdating(field).setAbstractValue(abstractValue, field);
}
}
@@ -188,7 +188,7 @@
public synchronized void methodReturnsAbstractValue(
DexEncodedMethod method, AppView<AppInfoWithLiveness> appView, AbstractValue value) {
if (appView.appInfo().mayPropagateValueFor(appView, method.getReference())) {
- getMethodOptimizationInfoForUpdating(method).markReturnsAbstractValue(value);
+ getMethodOptimizationInfoForUpdating(method).setAbstractReturnValue(value, method);
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
index c49c8be..a440900 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
@@ -65,7 +65,7 @@
public void recordFieldHasAbstractValue(
DexEncodedField field, AppView<AppInfoWithLiveness> appView, AbstractValue abstractValue) {
if (appView.appInfo().mayPropagateValueFor(appView, field.getReference())) {
- field.getMutableOptimizationInfo().setAbstractValue(abstractValue);
+ field.getMutableOptimizationInfo().setAbstractValue(abstractValue, field);
}
}
@@ -111,7 +111,7 @@
@Override
public void methodReturnsAbstractValue(
DexEncodedMethod method, AppView<AppInfoWithLiveness> appView, AbstractValue value) {
- method.getMutableOptimizationInfo().markReturnsAbstractValue(value);
+ method.getMutableOptimizationInfo().setAbstractReturnValue(value, method);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java
index d737cda..2683ff3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfo;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
@@ -62,7 +63,7 @@
@Override
public InstanceFieldInitializationInfo rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
// We don't have the context here to determine what should happen. It is the responsibility of
// optimizations that change the proto of instance initializers to update the argument
// initialization info.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java
index 856dfc0..003eef8 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.value.SingleValue;
@@ -51,5 +52,5 @@
ArgumentInfoCollection argumentInfoCollection);
InstanceFieldInitializationInfo rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens);
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens);
}
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 b095afc..0fecfb1 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
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
@@ -55,7 +56,7 @@
@Override
public InstanceFieldInitializationInfo rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
EnumDataMap enumDataMap = appView.unboxedEnums();
if (dynamicLowerBoundType != null
&& enumDataMap.isUnboxedEnum(dynamicLowerBoundType.getClassType())) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
index 88a7626..7fa9d04 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
@@ -85,7 +85,7 @@
(field, info) ->
builder.recordInitializationInfo(
lens.lookupField(field, codeLens),
- info.rewrittenWithLens(appView, lens, codeLens)));
+ info.rewrittenWithLens(appView, field.getType(), lens, codeLens)));
return builder.build();
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java
index 356926c..e4faa42 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -37,7 +38,7 @@
@Override
public InstanceFieldInitializationInfo rewrittenWithLens(
- AppView<AppInfoWithLiveness> appView, GraphLens lens, GraphLens codeLens) {
+ AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
return 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 4f97afa..12a71ce 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
@@ -135,7 +135,7 @@
@Override
public void fixup(
DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo) {
- optimizationInfo.fixupAbstractValue(appView, graphLens, codeLens);
+ optimizationInfo.fixupAbstractValue(appView, field, graphLens, codeLens);
}
@Override
@@ -144,7 +144,7 @@
// Fixup the return value in case the method returns a field that had its signature
// changed.
optimizationInfo
- .fixupAbstractReturnValue(appView, graphLens, codeLens)
+ .fixupAbstractReturnValue(appView, method, graphLens, codeLens)
.fixupInstanceInitializerInfo(appView, graphLens, codeLens, prunedItems);
// Rewrite the optimization info to account for method signature changes.