Relax assertion in member value propagation
Change-Id: Ie65d66a345658cf87dec4b6376d985b31f7bce3d
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java
index 64c5ea4..54da041 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/R8MemberValuePropagation.java
@@ -295,9 +295,7 @@
// This is guaranteed to read the static value of the field.
abstractValue = definition.getStaticValue().toAbstractValue(appView.abstractValueFactory());
// Verify that the optimization info is consistent with the static value.
- assert definition.getOptimizationInfo().getAbstractValue().isUnknown()
- || !definition.hasExplicitStaticValue()
- || abstractValue.equals(definition.getOptimizationInfo().getAbstractValue());
+ assert verifyStaticFieldValueConsistentWithOptimizationInfo(appView, definition);
} else {
// This is guaranteed to read the default value of the field.
abstractValue = appView.abstractValueFactory().createSingleNumberValue(0);
@@ -346,6 +344,19 @@
}
}
+ private boolean verifyStaticFieldValueConsistentWithOptimizationInfo(
+ AppView<?> appView, DexEncodedField field) {
+ AbstractValue computedValue = field.getOptimizationInfo().getAbstractValue();
+ AbstractValue staticValue =
+ field.getStaticValue().toAbstractValue(appView.abstractValueFactory());
+ assert computedValue.isUnknown()
+ || !field.hasExplicitStaticValue()
+ || appView
+ .getAbstractValueConstantPropagationJoiner()
+ .lessThanOrEqualTo(staticValue, computedValue, field.getTypeElement(appView));
+ return true;
+ }
+
@Override
void rewriteInstancePut(IRCode code, InstructionListIterator iterator, InstancePut current) {
replaceInstancePutByNullCheckIfNeverRead(code, iterator, current);