Fix width of type lattice elements

Change-Id: I00b99e34125b1a5dfa3a7af56b09efa353f66e66
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java
index abcdb9e..07e3503 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class BooleanTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class BooleanTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final BooleanTypeLatticeElement INSTANCE = new BooleanTypeLatticeElement();
 
   static BooleanTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java
index d05c25e..b2df89c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class ByteTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class ByteTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final ByteTypeLatticeElement INSTANCE = new ByteTypeLatticeElement();
 
   static ByteTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java
index 27834aa..3ff532f 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class CharTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class CharTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final CharTypeLatticeElement INSTANCE = new CharTypeLatticeElement();
 
   static CharTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java
index 06b7e8c..3f521c2 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class DoubleTypeLatticeElement extends WideTypeLatticeElement {
+public class DoubleTypeLatticeElement extends WidePrimitiveTypeLatticeElement {
+
   private static final DoubleTypeLatticeElement INSTANCE = new DoubleTypeLatticeElement();
 
   static DoubleTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java
index fa363ea..69933a0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeLatticeElement.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class FloatTypeLatticeElement extends SingleTypeLatticeElement {
+public class FloatTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
   private static final FloatTypeLatticeElement INSTANCE = new FloatTypeLatticeElement();
 
   static FloatTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java
index 7e295c1..2d7e5b3 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeLatticeElement.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class IntTypeLatticeElement extends SingleTypeLatticeElement {
+public class IntTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
   private static final IntTypeLatticeElement INSTANCE = new IntTypeLatticeElement();
 
   static IntTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java
index 71d7299..db3ef45 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class LongTypeLatticeElement extends WideTypeLatticeElement {
+public class LongTypeLatticeElement extends WidePrimitiveTypeLatticeElement {
+
   private static final LongTypeLatticeElement INSTANCE = new LongTypeLatticeElement();
 
   static LongTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java
index 569c903..f43ebab 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeLatticeElement.java
@@ -133,18 +133,18 @@
     if (this == other) {
       return this;
     }
-    if (isSingle()) {
-      if (other.isSingle()) {
+    if (isSinglePrimitive()) {
+      if (other.isSinglePrimitive()) {
         return TypeLatticeElement.SINGLE;
       }
-      assert other.isWide();
+      assert other.isWidePrimitive();
       return TypeLatticeElement.TOP;
     }
-    assert isWide();
-    if (other.isWide()) {
+    assert isWidePrimitive();
+    if (other.isWidePrimitive()) {
       return TypeLatticeElement.WIDE;
     }
-    assert other.isSingle();
+    assert other.isSinglePrimitive();
     return TypeLatticeElement.TOP;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java
index 6b56f08..85bd6fc 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeLatticeElement.java
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.analysis.type;
 
-public class ShortTypeLatticeElement extends PrimitiveTypeLatticeElement {
+public class ShortTypeLatticeElement extends SinglePrimitiveTypeLatticeElement {
+
   private static final ShortTypeLatticeElement INSTANCE = new ShortTypeLatticeElement();
 
   static ShortTypeLatticeElement getInstance() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeLatticeElement.java
new file mode 100644
index 0000000..2a94fb5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeLatticeElement.java
@@ -0,0 +1,39 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.ir.analysis.type;
+
+/** A {@link TypeLatticeElement} that abstracts primitive types, which fit in 32 bits. */
+public class SinglePrimitiveTypeLatticeElement extends PrimitiveTypeLatticeElement {
+
+  private static final SinglePrimitiveTypeLatticeElement INSTANCE =
+      new SinglePrimitiveTypeLatticeElement();
+
+  SinglePrimitiveTypeLatticeElement() {
+    super();
+  }
+
+  static SinglePrimitiveTypeLatticeElement getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean isSinglePrimitive() {
+    return true;
+  }
+
+  @Override
+  public String toString() {
+    return "SINGLE";
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return this == o;
+  }
+
+  @Override
+  public int hashCode() {
+    return System.identityHashCode(INSTANCE);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/SingleTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/SingleTypeLatticeElement.java
deleted file mode 100644
index 081bc60..0000000
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/SingleTypeLatticeElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.ir.analysis.type;
-
-/**
- * A {@link TypeLatticeElement} that abstracts primitive types, which fit in 32 bits.
- */
-public class SingleTypeLatticeElement extends PrimitiveTypeLatticeElement {
-  private static final SingleTypeLatticeElement SINGLE_INSTANCE = new SingleTypeLatticeElement();
-
-  SingleTypeLatticeElement() {
-    super();
-  }
-
-  static SingleTypeLatticeElement getInstance() {
-    return SINGLE_INSTANCE;
-  }
-
-  @Override
-  public boolean isSingle() {
-    return true;
-  }
-
-  @Override
-  public String toString() {
-    return "SINGLE";
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return this == o;
-  }
-
-  @Override
-  public int hashCode() {
-    return System.identityHashCode(SINGLE_INSTANCE);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java
index 702d2f8..a9cd745 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElement.java
@@ -23,10 +23,12 @@
   static final CharTypeLatticeElement CHAR = CharTypeLatticeElement.getInstance();
   public static final IntTypeLatticeElement INT = IntTypeLatticeElement.getInstance();
   public static final FloatTypeLatticeElement FLOAT = FloatTypeLatticeElement.getInstance();
-  public static final SingleTypeLatticeElement SINGLE = SingleTypeLatticeElement.getInstance();
+  public static final SinglePrimitiveTypeLatticeElement SINGLE =
+      SinglePrimitiveTypeLatticeElement.getInstance();
   public static final LongTypeLatticeElement LONG = LongTypeLatticeElement.getInstance();
   public static final DoubleTypeLatticeElement DOUBLE = DoubleTypeLatticeElement.getInstance();
-  public static final WideTypeLatticeElement WIDE = WideTypeLatticeElement.getInstance();
+  public static final WidePrimitiveTypeLatticeElement WIDE =
+      WidePrimitiveTypeLatticeElement.getInstance();
   public static final ReferenceTypeLatticeElement NULL =
       ReferenceTypeLatticeElement.getNullTypeLatticeElement();
 
@@ -243,11 +245,11 @@
     return null;
   }
 
-  public boolean isSingle() {
+  public boolean isSinglePrimitive() {
     return false;
   }
 
-  public boolean isWide() {
+  public boolean isWidePrimitive() {
     return false;
   }
 
@@ -328,7 +330,7 @@
 
   public int requiredRegisters() {
     assert !isBottom() && !isTop();
-    return isWide() ? 2 : 1;
+    return 1;
   }
 
   public static ClassTypeLatticeElement objectClassType(
@@ -375,8 +377,8 @@
 
   public boolean isValueTypeCompatible(TypeLatticeElement other) {
     return (isReference() && other.isReference())
-        || (isSingle() && other.isSingle())
-        || (isWide() && other.isWide());
+        || (isSinglePrimitive() && other.isSinglePrimitive())
+        || (isWidePrimitive() && other.isWidePrimitive());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeLatticeElement.java
new file mode 100644
index 0000000..3e07e54
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeLatticeElement.java
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.ir.analysis.type;
+
+/** A {@link TypeLatticeElement} that abstracts primitive types, which fit in 64 bits. */
+public class WidePrimitiveTypeLatticeElement extends PrimitiveTypeLatticeElement {
+
+  private static final WidePrimitiveTypeLatticeElement INSTANCE =
+      new WidePrimitiveTypeLatticeElement();
+
+  WidePrimitiveTypeLatticeElement() {
+    super();
+  }
+
+  static WidePrimitiveTypeLatticeElement getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean isWidePrimitive() {
+    return true;
+  }
+
+  @Override
+  public int requiredRegisters() {
+    return 2;
+  }
+
+  @Override
+  public String toString() {
+    return "WIDE";
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return this == o;
+  }
+
+  @Override
+  public int hashCode() {
+    return System.identityHashCode(INSTANCE);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/WideTypeLatticeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/WideTypeLatticeElement.java
deleted file mode 100644
index 9ea41a9..0000000
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/WideTypeLatticeElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.ir.analysis.type;
-
-/**
- * A {@link TypeLatticeElement} that abstracts primitive types, which fit in 64 bits.
- */
-public class WideTypeLatticeElement extends PrimitiveTypeLatticeElement {
-  private static final WideTypeLatticeElement WIDE_INSTANCE = new WideTypeLatticeElement();
-
-  WideTypeLatticeElement() {
-    super();
-  }
-
-  static WideTypeLatticeElement getInstance() {
-    return WIDE_INSTANCE;
-  }
-
-  @Override
-  public boolean isWide() {
-    return true;
-  }
-
-  @Override
-  public String toString() {
-    return "WIDE";
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return this == o;
-  }
-
-  @Override
-  public int hashCode() {
-    return System.identityHashCode(WIDE_INSTANCE);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index 77bdbce..045acf6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -217,11 +217,11 @@
         return TypeLatticeElement.DOUBLE;
       case INT_OR_FLOAT:
         assert arrayTypeLattice == null
-            || arrayTypeLattice.getArrayMemberTypeAsValueType().isSingle();
+            || arrayTypeLattice.getArrayMemberTypeAsValueType().isSinglePrimitive();
         return checkConstraint(dest(), ValueTypeConstraint.INT_OR_FLOAT);
       case LONG_OR_DOUBLE:
         assert arrayTypeLattice == null
-            || arrayTypeLattice.getArrayMemberTypeAsValueType().isWide();
+            || arrayTypeLattice.getArrayMemberTypeAsValueType().isWidePrimitive();
         return checkConstraint(dest(), ValueTypeConstraint.LONG_OR_DOUBLE);
       default:
         throw new Unreachable("Unexpected member type: " + getMemberType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/Dup.java b/src/main/java/com/android/tools/r8/ir/code/Dup.java
index 0a09d78..715190f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Dup.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Dup.java
@@ -64,7 +64,7 @@
 
   @Override
   public void buildCf(CfBuilder builder) {
-    if (this.inValues.get(0).getTypeLattice().isWide()) {
+    if (this.inValues.get(0).getTypeLattice().isWidePrimitive()) {
       builder.add(new CfStackInstruction(Opcode.Dup2));
     } else {
       builder.add(new CfStackInstruction(Opcode.Dup));
diff --git a/src/main/java/com/android/tools/r8/ir/code/Dup2.java b/src/main/java/com/android/tools/r8/ir/code/Dup2.java
index 6564fbe..cb80e23 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Dup2.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Dup2.java
@@ -32,8 +32,8 @@
 
   private Dup2(StackValues dest, Value srcBottom, Value srcTop) {
     super(dest, ImmutableList.of(srcBottom, srcTop));
-    assert !srcBottom.getTypeLattice().isWide();
-    assert !srcTop.getTypeLattice().isWide();
+    assert !srcBottom.getTypeLattice().isWidePrimitive();
+    assert !srcTop.getTypeLattice().isWidePrimitive();
     assert dest.getStackValues().length == 4;
     assert srcBottom.isValueOnStack() && !(srcBottom instanceof StackValues);
     assert srcTop.isValueOnStack() && !(srcTop instanceof StackValues);
diff --git a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
index e8f995b..f7411d9 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FixedRegisterValue.java
@@ -22,7 +22,7 @@
   public ValueType outType() {
     TypeLatticeElement type = getTypeLattice();
     if (type.isPrimitive()) {
-      if (type.isSingle()) {
+      if (type.isSinglePrimitive()) {
         if (type.isInt()) {
           return ValueType.INT;
         }
@@ -30,7 +30,7 @@
           return ValueType.FLOAT;
         }
       } else {
-        assert type.isWide();
+        assert type.isWidePrimitive();
         if (type.isDouble()) {
           return ValueType.DOUBLE;
         }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
index b515ab3..44864f6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -166,9 +166,9 @@
       TypeLatticeElement moveType = outValue.getTypeLattice();
       int register = builder.allocatedRegister(outValue, getNumber());
       com.android.tools.r8.code.Instruction moveResult;
-      if (moveType.isSingle()) {
+      if (moveType.isSinglePrimitive()) {
         moveResult = new MoveResult(register);
-      } else if (moveType.isWide()) {
+      } else if (moveType.isWidePrimitive()) {
         moveResult = new MoveResultWide(register);
       } else if (moveType.isReference()) {
         moveResult = new MoveResultObject(register);
diff --git a/src/main/java/com/android/tools/r8/ir/code/Return.java b/src/main/java/com/android/tools/r8/ir/code/Return.java
index 163b27a..9ac794c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Return.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Return.java
@@ -56,10 +56,10 @@
     if (returnType.isReference()) {
       return new ReturnObject(register);
     }
-    if (returnType.isSingle()) {
+    if (returnType.isSinglePrimitive()) {
       return new com.android.tools.r8.code.Return(register);
     }
-    if (returnType.isWide()) {
+    if (returnType.isWidePrimitive()) {
       return new ReturnWide(register);
     }
     throw new Unreachable();
diff --git a/src/main/java/com/android/tools/r8/ir/code/Swap.java b/src/main/java/com/android/tools/r8/ir/code/Swap.java
index a43979c..93e3976 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Swap.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Swap.java
@@ -25,7 +25,7 @@
     super(dest, ImmutableList.of(src1, src2));
     assert src1.isValueOnStack() && !(src1 instanceof StackValues);
     assert src2.isValueOnStack() && !(src2 instanceof StackValues);
-    assert !src1.getTypeLattice().isWide() && !src2.getTypeLattice().isWide();
+    assert !src1.getTypeLattice().isWidePrimitive() && !src2.getTypeLattice().isWidePrimitive();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index fde5ca7..1d2c6ca 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -53,7 +53,8 @@
   }
 
   public TypeLatticeElement constrainedType(ValueTypeConstraint constraint) {
-    if (constraint == ValueTypeConstraint.INT_OR_FLOAT_OR_OBJECT && !typeLattice.isWide()) {
+    if (constraint == ValueTypeConstraint.INT_OR_FLOAT_OR_OBJECT
+        && !typeLattice.isWidePrimitive()) {
       return typeLattice;
     }
     switch (constraint) {
@@ -79,12 +80,12 @@
         }
         break;
       case INT:
-        if (typeLattice.isTop() || (typeLattice.isSingle() && !typeLattice.isFloat())) {
+        if (typeLattice.isTop() || (typeLattice.isSinglePrimitive() && !typeLattice.isFloat())) {
           return TypeLatticeElement.INT;
         }
         break;
       case FLOAT:
-        if (typeLattice.isTop() || (typeLattice.isSingle() && !typeLattice.isInt())) {
+        if (typeLattice.isTop() || (typeLattice.isSinglePrimitive() && !typeLattice.isInt())) {
           return TypeLatticeElement.FLOAT;
         }
         break;
@@ -92,22 +93,22 @@
         if (typeLattice.isTop()) {
           return TypeLatticeElement.SINGLE;
         }
-        if (typeLattice.isSingle()) {
+        if (typeLattice.isSinglePrimitive()) {
           return typeLattice;
         }
         break;
       case LONG:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWidePrimitive()) {
           return TypeLatticeElement.LONG;
         }
         break;
       case DOUBLE:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWidePrimitive()) {
           return TypeLatticeElement.DOUBLE;
         }
         break;
       case LONG_OR_DOUBLE:
-        if (typeLattice.isWide()) {
+        if (typeLattice.isWidePrimitive()) {
           return typeLattice;
         }
         break;
@@ -747,7 +748,7 @@
       builder.append("(");
       if (isConstant && definition.asConstNumber().outValue != null) {
         ConstNumber constNumber = definition.asConstNumber();
-        if (constNumber.outValue().getTypeLattice().isSingle()) {
+        if (constNumber.outValue().getTypeLattice().isSinglePrimitive()) {
           builder.append((int) constNumber.getRawValue());
         } else {
           builder.append(constNumber.getRawValue());
@@ -926,11 +927,11 @@
 
   public LongInterval getValueRange() {
     if (isConstNumber()) {
-      if (typeLattice.isSingle()) {
+      if (typeLattice.isSinglePrimitive()) {
         int value = getConstInstruction().asConstNumber().getIntValue();
         return new LongInterval(value, value);
       } else {
-        assert typeLattice.isWide();
+        assert typeLattice.isWidePrimitive();
         long value = getConstInstruction().asConstNumber().getLongValue();
         return new LongInterval(value, value);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java b/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java
index 9ee7b0f..eb0ba83 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ValueTypeConstraint.java
@@ -145,10 +145,10 @@
     if (typeLatticeElement.isDouble()) {
       return DOUBLE;
     }
-    if (typeLatticeElement.isSingle()) {
+    if (typeLatticeElement.isSinglePrimitive()) {
       return INT_OR_FLOAT;
     }
-    if (typeLatticeElement.isWide()) {
+    if (typeLatticeElement.isWidePrimitive()) {
       return LONG_OR_DOUBLE;
     }
     if (typeLatticeElement.isTop()) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index 9e7b696..5763523 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -1420,9 +1420,9 @@
             instruction = new Nop();
             break;
           }
-          if (moveType.isSingle()) {
+          if (moveType.isSinglePrimitive()) {
             instruction = new com.android.tools.r8.code.Move(dest, src);
-          } else if (moveType.isWide()) {
+          } else if (moveType.isWidePrimitive()) {
             instruction = new MoveWide(dest, src);
           } else if (moveType.isReference()) {
             instruction = new MoveObject(dest, src);
@@ -1431,9 +1431,9 @@
           }
           break;
         case 2:
-          if (moveType.isSingle()) {
+          if (moveType.isSinglePrimitive()) {
             instruction = new MoveFrom16(dest, src);
-          } else if (moveType.isWide()) {
+          } else if (moveType.isWidePrimitive()) {
             instruction = new MoveWideFrom16(dest, src);
           } else if (moveType.isReference()) {
             instruction = new MoveObjectFrom16(dest, src);
@@ -1442,9 +1442,9 @@
           }
           break;
         case 3:
-          if (moveType.isSingle()) {
+          if (moveType.isSinglePrimitive()) {
             instruction = new Move16(dest, src);
-          } else if (moveType.isWide()) {
+          } else if (moveType.isWidePrimitive()) {
             instruction = new MoveWide16(dest, src);
           } else if (moveType.isReference()) {
             instruction = new MoveObject16(dest, src);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java
index 78e90a9..8d84870 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/DupDupDupPeephole.java
@@ -28,11 +28,11 @@
 public class DupDupDupPeephole implements BasicBlockPeephole {
 
   private final Point dup1Exp =
-      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWide());
+      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWidePrimitive());
   private final Point dup2Exp =
-      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWide());
+      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWidePrimitive());
   private final Point dup3Exp =
-      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWide());
+      new Point((i) -> i.isDup() && !i.inValues().get(0).getTypeLattice().isWidePrimitive());
 
   private final PeepholeLayout layout = PeepholeLayout.lookBackward(dup1Exp, dup2Exp, dup3Exp);
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java
index 3863945..421bdbf 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/peepholes/StoreSequenceLoadPeephole.java
@@ -40,7 +40,7 @@
       new Point(
           (i) -> {
             if (!i.isStore()
-                || i.asStore().src().getTypeLattice().isWide()
+                || i.asStore().src().getTypeLattice().isWidePrimitive()
                 || i.outValue().hasLocalInfo()
                 || i.asStore().outValue().numberOfAllUsers() != 1) {
               return false;
@@ -102,7 +102,7 @@
       lastOut = stackValues[stackValues.length - 1];
     }
 
-    if (lastOut == null || lastOut.getTypeLattice().isWide()) {
+    if (lastOut == null || lastOut.getTypeLattice().isWidePrimitive()) {
       return false;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
index 92992e8..dda59e6 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMove.java
@@ -33,7 +33,7 @@
   }
 
   private boolean writes(int register) {
-    if (type.isWide() && (dst + 1) == register) {
+    if (type.isWidePrimitive() && (dst + 1) == register) {
       return true;
     }
     return dst == register;
@@ -48,7 +48,7 @@
         if (writes(valueMap.get(move.src))) {
           return true;
         }
-        if (move.type.isWide()) {
+        if (move.type.isWidePrimitive()) {
           if (writes(valueMap.get(move.src) + 1)) {
             return true;
           }
@@ -85,8 +85,8 @@
     if (type.isPrimitive() != o.type.isPrimitive()) {
       return Boolean.compare(type.isPrimitive(), o.type.isPrimitive());
     }
-    if (type.isWide() != o.type.isWide()) {
-      return Boolean.compare(type.isWide(), o.type.isWide());
+    if (type.isWidePrimitive() != o.type.isWidePrimitive()) {
+      return Boolean.compare(type.isWidePrimitive(), o.type.isWidePrimitive());
     }
     if (type.isReference() != o.type.isReference()) {
       return Boolean.compare(type.isReference(), o.type.isReference());
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java
index d268d62..08afab7 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/RegisterMoveScheduler.java
@@ -124,9 +124,9 @@
       int moveSrc = valueMap.get(move.src);
       if (moveSrc == src) {
         result.add(move);
-      } else if (move.type.isWide() && (moveSrc + 1) == src) {
+      } else if (move.type.isWidePrimitive() && (moveSrc + 1) == src) {
         result.add(move);
-      } else if (type.isWide() && (moveSrc - 1) == src) {
+      } else if (type.isWidePrimitive() && (moveSrc - 1) == src) {
         result.add(move);
       }
     }
@@ -194,7 +194,7 @@
     // Pick a non-wide move to unblock if possible.
     while (iterator.hasNext()) {
       move = iterator.next();
-      if (!move.type.isWide()) {
+      if (!move.type.isWidePrimitive()) {
         break;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
index e8c54f5..aae72b4 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/SpillMoveSet.java
@@ -201,8 +201,8 @@
     TypeLatticeElement toType = to.getValue().getTypeLattice();
     TypeLatticeElement fromType = from.getValue().getTypeLattice();
     if (toType.isReference() || fromType.isReference()) {
-      assert fromType.isReference() || fromType.isSingle();
-      assert toType.isReference() || toType.isSingle();
+      assert fromType.isReference() || fromType.isSinglePrimitive();
+      assert toType.isReference() || toType.isSinglePrimitive();
       return objectType;
     }
     assert toType == fromType;
@@ -370,7 +370,7 @@
         // avoid a bug where the index variable could end up being uninitialized.
         if (allocator.options().canHaveBoundsCheckEliminationBug()
             && move.from.getValue().isConstNumber()
-            && move.type.isSingle()
+            && move.type.isSinglePrimitive()
             && allocator.unadjustedRealRegisterFromAllocated(move.to.getRegister()) < 256) {
           scheduler.addMove(
               new RegisterMove(move.to.getRegister(), move.type, move.from.getValue().definition));
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElementWidthTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElementWidthTest.java
new file mode 100644
index 0000000..d6b9598
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeElementWidthTest.java
@@ -0,0 +1,94 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.analysis.type;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+
+public class TypeLatticeElementWidthTest extends TestBase {
+
+  @Test
+  public void testArrayWidth() {
+    ArrayTypeLatticeElement arrayType =
+        ArrayTypeLatticeElement.create(
+            IntTypeLatticeElement.getInstance(), Nullability.maybeNull());
+    assertFalse(arrayType.isSinglePrimitive());
+    assertFalse(arrayType.isWidePrimitive());
+    assertEquals(1, arrayType.requiredRegisters());
+  }
+
+  @Test
+  public void testBooleanWidth() {
+    assertTrue(BooleanTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(BooleanTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, BooleanTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testByteWidth() {
+    assertTrue(ByteTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(ByteTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, ByteTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testCharWidth() {
+    assertTrue(CharTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(CharTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, CharTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testDoubleWidth() {
+    assertTrue(DoubleTypeLatticeElement.getInstance().isWidePrimitive());
+    assertFalse(DoubleTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertEquals(2, DoubleTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testFloatWidth() {
+    assertTrue(FloatTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(FloatTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, FloatTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testIntWidth() {
+    assertTrue(IntTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(IntTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, IntTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testLongWidth() {
+    assertTrue(LongTypeLatticeElement.getInstance().isWidePrimitive());
+    assertFalse(LongTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertEquals(2, LongTypeLatticeElement.getInstance().requiredRegisters());
+  }
+
+  @Test
+  public void testReferenceWidth() {
+    DexItemFactory dexItemFactory = new DexItemFactory();
+    ClassTypeLatticeElement referenceType =
+        ClassTypeLatticeElement.create(
+            dexItemFactory.objectType, Nullability.maybeNull(), ImmutableSet.of());
+    assertFalse(referenceType.isSinglePrimitive());
+    assertFalse(referenceType.isWidePrimitive());
+    assertEquals(1, referenceType.requiredRegisters());
+  }
+
+  @Test
+  public void testShortWidth() {
+    assertTrue(ShortTypeLatticeElement.getInstance().isSinglePrimitive());
+    assertFalse(ShortTypeLatticeElement.getInstance().isWidePrimitive());
+    assertEquals(1, ShortTypeLatticeElement.getInstance().requiredRegisters());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
index 54f1a68..25988b8 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
@@ -71,11 +71,11 @@
     return TypeLatticeElement.BOTTOM;
   }
 
-  private SingleTypeLatticeElement single() {
+  private SinglePrimitiveTypeLatticeElement single() {
     return TypeLatticeElement.SINGLE;
   }
 
-  private WideTypeLatticeElement wide() {
+  private WidePrimitiveTypeLatticeElement wide() {
     return TypeLatticeElement.WIDE;
   }