Fix assertion error due to primitive or null value after enum unboxing
Change-Id: I04ceb80293bf84bf2ed379f1e9c5a269e0f8f166
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 6eaf130..85534f3 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
@@ -14,6 +14,7 @@
private final AbstractValue value;
private NullOrAbstractValue(AbstractValue value) {
+ assert !value.isSingleNumberValue();
this.value = value;
}
@@ -44,9 +45,14 @@
}
@Override
- public NullOrAbstractValue rewrittenWithLens(
+ public AbstractValue rewrittenWithLens(
AppView<AppInfoWithLiveness> appView, DexType newType, GraphLens lens, GraphLens codeLens) {
- return new NullOrAbstractValue(value.rewrittenWithLens(appView, newType, lens, codeLens));
+ AbstractValue rewrittenValue = value.rewrittenWithLens(appView, newType, lens, codeLens);
+ if (rewrittenValue.isSingleNumberValue()) {
+ // Reference type rewritten to primitive.
+ return unknown();
+ }
+ return new NullOrAbstractValue(rewrittenValue);
}
@Override
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 21fca73..9617c85 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
@@ -67,7 +67,10 @@
}
private MutableFieldOptimizationInfo setAbstractValue(AbstractValue abstractValue) {
- assert getAbstractValue().isUnknown() || abstractValue.isNonTrivial();
+ assert getAbstractValue().isUnknown()
+ || abstractValue.isNonTrivial()
+ || (getAbstractValue().isNullOrAbstractValue()
+ && getAbstractValue().asNullOrAbstractValue().getNonNullValue().isSingleFieldValue());
this.abstractValue = abstractValue;
return this;
}