Reapply "The meet of precise types is only defined for identical types."

This reverts commit 3a6588596218cabfc3e47fb899a3ef9a47b0713e.

Reason for revert: can now land after resolving the issues where a local variable could be referenced at two different types: https://r8-review.googlesource.com/c/r8/+/24722

Bug: 111429335
Change-Id: Id32f5f49525893d21c3a6770a13072f4574d9acd
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");