Ensure consistent IR graph has only precise types.
Change-Id: I25b3c97a69c9303c34d2aeb3d19749022733f833
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index a5d3e4a..4529112 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -376,7 +376,7 @@
for (Phi phi : block.getPhis()) {
assert !phi.isTrivialPhi();
assert phi.getOperands().size() == predecessorCount;
- assert phi.outType() != ValueType.INT_OR_FLOAT_OR_NULL;
+ assert phi.outType().isPreciseType();
values.add(phi);
for (Value value : phi.getOperands()) {
values.add(value);
@@ -393,7 +393,7 @@
if (outValue != null) {
values.add(outValue);
assert outValue.definition == instruction;
- assert outValue.outType() != ValueType.INT_OR_FLOAT_OR_NULL;
+ assert outValue.outType().isPreciseType();
}
for (Value value : instruction.inValues()) {
values.add(value);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
index 3e693f3..3b2be1f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
@@ -73,7 +73,15 @@
private ValueType getPreciseType(Value value) {
ValueType type = canonical(value).outType();
- return type != ValueType.INT_OR_FLOAT_OR_NULL ? type : ValueType.INT_OR_FLOAT;
+ if (type.isPreciseType()) {
+ return type;
+ }
+ // If the type is still imprecise, then there are no constraints forcing its type and we
+ // arbitrarily choose long for wide values and int for single values.
+ if (type.isWide()) {
+ return ValueType.LONG;
+ }
+ return ValueType.INT;
}
private void link(Value canonical1, Value canonical2) {