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;
}