Merge "The meet of precise types is only defined for identical types."
diff --git a/src/main/java/com/android/tools/r8/ir/code/ValueType.java b/src/main/java/com/android/tools/r8/ir/code/ValueType.java
index c414342..69618b3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ValueType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ValueType.java
@@ -48,6 +48,10 @@
if (other == INT_OR_FLOAT_OR_NULL) {
return other.meet(this);
}
+ if (isPreciseType() && other.isPreciseType()) {
+ // Precise types must be identical, hitting the first check above.
+ throw new CompilationError("Cannot compute meet of types: " + this + " and " + other);
+ }
switch (this) {
case OBJECT:
{
diff --git a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
index 0f3cadc..11ad12b 100644
--- a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
@@ -11,12 +11,14 @@
import com.android.tools.r8.utils.TestDescriptionWatcher;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -89,6 +91,11 @@
// This list is currently empty!
);
+ private Set<String> failingOnX8 = ImmutableSet.of(
+ // Contains use of register as both an int and a float.
+ "regression/33336471"
+ );
+
@Rule
public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
@@ -161,6 +168,10 @@
.addLibraryFiles(ToolHelper.getDefaultAndroidJar())
.setOutput(Paths.get(outputPath), OutputMode.DexIndexed);
ToolHelper.getAppBuilder(builder).addProgramFiles(originalDexFile);
+
+ if (failingOnX8.contains(directoryName)) {
+ thrown.expect(CompilationFailedException.class);
+ }
R8.run(builder.build());
if (!ToolHelper.artSupported()) {
diff --git a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
index 5270cd4..86c4242 100644
--- a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.graph.DexCode;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApp;
@@ -37,28 +36,23 @@
builder.addStaticField("stringField", "Ljava/lang/String;");
builder.addStaticField("testField", "LTest;");
- boolean isDalvik = ToolHelper.getDexVm().isOlderThanOrEqual(DexVm.ART_4_4_4_HOST);
- String additionalConstZero = isDalvik ? "const v0, 0" : "";
- String additionalConstZeroWide = isDalvik ? "const-wide v0, 0" : "";
-
builder.addStaticMethod("void", "test", ImmutableList.of(),
2,
- "const v0, 0",
+ "const v0, 0", // single non-float typed zero (ie, int type)
"sput-boolean v0, LTest;->booleanField:Z",
"sput-byte v0, LTest;->byteField:B",
+ "sput-char v0, LTest;->charField:C",
"sput-short v0, LTest;->shortField:S",
"sput v0, LTest;->intField:I",
- // Dalvik 4.x. does not require a new const 0 here.
+ "const v0, 0", // float typed zero
"sput v0, LTest;->floatField:F",
- additionalConstZero, // Required for Dalvik 4.x.
- "sput-char v0, LTest;->charField:C",
- "const v0, 0",
+ "const v0, 0", // reference typed null
"sput-object v0, LTest;->objectField:Ljava/lang/Object;",
"sput-object v0, LTest;->stringField:Ljava/lang/String;",
"sput-object v0, LTest;->testField:LTest;",
- "const-wide v0, 0",
+ "const-wide v0, 0", // wide typed long
"sput-wide v0, LTest;->longField:J",
- additionalConstZeroWide, // Required for Dalvik 4.x.
+ "const-wide v0, 0", // wide typed double
"sput-wide v0, LTest;->doubleField:D",
"return-void");
@@ -103,28 +97,23 @@
builder.addInstanceField("stringField", "Ljava/lang/String;");
builder.addInstanceField("testField", "LTest;");
- boolean isDalvik = ToolHelper.getDexVm().isOlderThanOrEqual(DexVm.ART_4_4_4_HOST);
- String additionalConstZero = isDalvik ? "const v0, 0" : "";
- String additionalConstZeroWide = isDalvik ? "const-wide v0, 0" : "";
-
builder.addInstanceMethod("void", "test", ImmutableList.of(),
2,
"const v0, 0",
"iput-boolean v0, p0, LTest;->booleanField:Z",
"iput-byte v0, p0, LTest;->byteField:B",
+ "iput-char v0, p0, LTest;->charField:C",
"iput-short v0, p0, LTest;->shortField:S",
"iput v0, p0, LTest;->intField:I",
- // Dalvik 4.x. does not require a new const 0 here.
+ "const v0, 0",
"iput v0, p0, LTest;->floatField:F",
- additionalConstZero, // Required for Dalvik 4.x.
- "iput-char v0, p0, LTest;->charField:C",
"const v0, 0",
"iput-object v0, p0, LTest;->objectField:Ljava/lang/Object;",
"iput-object v0, p0, LTest;->stringField:Ljava/lang/String;",
"iput-object v0, p0, LTest;->testField:LTest;",
"const-wide v0, 0",
"iput-wide v0, p0, LTest;->longField:J",
- additionalConstZeroWide, // Required for Dalvik 4.x.
+ "const-wide v0, 0",
"iput-wide v0, p0, LTest;->doubleField:D",
"return-void");