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) {