ART: Introduce compiler data type.

Replace most uses of the runtime's Primitive in compiler
with a new class DataType. This prepares for introducing
new types, such as Uint8, that the runtime does not need
to know about.

Test: m test-art-host-gtest
Test: testrunner.py --host
Bug: 23964345
Change-Id: Iec2ad82454eec678fffcd8279a9746b90feb9b0c
diff --git a/compiler/optimizing/side_effects_test.cc b/compiler/optimizing/side_effects_test.cc
index b01bc1c..ac5eb15 100644
--- a/compiler/optimizing/side_effects_test.cc
+++ b/compiler/optimizing/side_effects_test.cc
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-#include "gtest/gtest.h"
+#include <gtest/gtest.h>
+
+#include "data_type.h"
 #include "nodes.h"
-#include "primitive.h"
 
 namespace art {
 
@@ -89,18 +90,18 @@
 }
 
 TEST(SideEffectsTest, DependencesAndNoDependences) {
-  // Apply test to each individual primitive type.
-  for (Primitive::Type type = Primitive::kPrimNot;
-      type < Primitive::kPrimVoid;
-      type = Primitive::Type(type + 1)) {
-    // Same primitive type and access type: proper write/read dep.
+  // Apply test to each individual data type.
+  for (DataType::Type type = DataType::Type::kReference;
+       type < DataType::Type::kVoid;
+       type = static_cast<DataType::Type>(static_cast<uint8_t>(type) + 1u)) {
+    // Same data type and access type: proper write/read dep.
     testWriteAndReadDependence(
         SideEffects::FieldWriteOfType(type, false),
         SideEffects::FieldReadOfType(type, false));
     testWriteAndReadDependence(
         SideEffects::ArrayWriteOfType(type),
         SideEffects::ArrayReadOfType(type));
-    // Same primitive type but different access type: no write/read dep.
+    // Same data type but different access type: no write/read dep.
     testNoWriteAndReadDependence(
         SideEffects::FieldWriteOfType(type, false),
         SideEffects::ArrayReadOfType(type));
@@ -111,31 +112,31 @@
 }
 
 TEST(SideEffectsTest, NoDependences) {
-  // Different primitive type, same access type: no write/read dep.
+  // Different data type, same access type: no write/read dep.
   testNoWriteAndReadDependence(
-      SideEffects::FieldWriteOfType(Primitive::kPrimInt, false),
-      SideEffects::FieldReadOfType(Primitive::kPrimDouble, false));
+      SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
+      SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
   testNoWriteAndReadDependence(
-      SideEffects::ArrayWriteOfType(Primitive::kPrimInt),
-      SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
+      SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
+      SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
   // Everything different: no write/read dep.
   testNoWriteAndReadDependence(
-      SideEffects::FieldWriteOfType(Primitive::kPrimInt, false),
-      SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
+      SideEffects::FieldWriteOfType(DataType::Type::kInt32, false),
+      SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
   testNoWriteAndReadDependence(
-      SideEffects::ArrayWriteOfType(Primitive::kPrimInt),
-      SideEffects::FieldReadOfType(Primitive::kPrimDouble, false));
+      SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
+      SideEffects::FieldReadOfType(DataType::Type::kFloat64, false));
 }
 
 TEST(SideEffectsTest, VolatileDependences) {
   SideEffects volatile_write =
-      SideEffects::FieldWriteOfType(Primitive::kPrimInt, /* is_volatile */ true);
+      SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ true);
   SideEffects any_write =
-      SideEffects::FieldWriteOfType(Primitive::kPrimInt, /* is_volatile */ false);
+      SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false);
   SideEffects volatile_read =
-      SideEffects::FieldReadOfType(Primitive::kPrimByte, /* is_volatile */ true);
+      SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ true);
   SideEffects any_read =
-      SideEffects::FieldReadOfType(Primitive::kPrimByte, /* is_volatile */ false);
+      SideEffects::FieldReadOfType(DataType::Type::kInt8, /* is_volatile */ false);
 
   EXPECT_FALSE(volatile_write.MayDependOn(any_read));
   EXPECT_TRUE(any_read.MayDependOn(volatile_write));
@@ -151,26 +152,26 @@
 TEST(SideEffectsTest, SameWidthTypesNoAlias) {
   // Type I/F.
   testNoWriteAndReadDependence(
-      SideEffects::FieldWriteOfType(Primitive::kPrimInt, /* is_volatile */ false),
-      SideEffects::FieldReadOfType(Primitive::kPrimFloat, /* is_volatile */ false));
+      SideEffects::FieldWriteOfType(DataType::Type::kInt32, /* is_volatile */ false),
+      SideEffects::FieldReadOfType(DataType::Type::kFloat32, /* is_volatile */ false));
   testNoWriteAndReadDependence(
-      SideEffects::ArrayWriteOfType(Primitive::kPrimInt),
-      SideEffects::ArrayReadOfType(Primitive::kPrimFloat));
+      SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
+      SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
   // Type L/D.
   testNoWriteAndReadDependence(
-      SideEffects::FieldWriteOfType(Primitive::kPrimLong, /* is_volatile */ false),
-      SideEffects::FieldReadOfType(Primitive::kPrimDouble, /* is_volatile */ false));
+      SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false),
+      SideEffects::FieldReadOfType(DataType::Type::kFloat64, /* is_volatile */ false));
   testNoWriteAndReadDependence(
-      SideEffects::ArrayWriteOfType(Primitive::kPrimLong),
-      SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
+      SideEffects::ArrayWriteOfType(DataType::Type::kInt64),
+      SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
 }
 
 TEST(SideEffectsTest, AllWritesAndReads) {
   SideEffects s = SideEffects::None();
   // Keep taking the union of different writes and reads.
-  for (Primitive::Type type = Primitive::kPrimNot;
-        type < Primitive::kPrimVoid;
-        type = Primitive::Type(type + 1)) {
+  for (DataType::Type type = DataType::Type::kReference;
+       type < DataType::Type::kVoid;
+       type = static_cast<DataType::Type>(static_cast<uint8_t>(type) + 1u)) {
     s = s.Union(SideEffects::FieldWriteOfType(type, /* is_volatile */ false));
     s = s.Union(SideEffects::ArrayWriteOfType(type));
     s = s.Union(SideEffects::FieldReadOfType(type, /* is_volatile */ false));
@@ -214,41 +215,41 @@
       SideEffects::AllReads().ToString().c_str());
   EXPECT_STREQ(
       "||||||L|",
-      SideEffects::FieldWriteOfType(Primitive::kPrimNot, false).ToString().c_str());
+      SideEffects::FieldWriteOfType(DataType::Type::kReference, false).ToString().c_str());
   EXPECT_STREQ(
       "||DFJISCBZL|DFJISCBZL||DFJISCBZL|DFJISCBZL|",
-      SideEffects::FieldWriteOfType(Primitive::kPrimNot, true).ToString().c_str());
+      SideEffects::FieldWriteOfType(DataType::Type::kReference, true).ToString().c_str());
   EXPECT_STREQ(
       "|||||Z||",
-      SideEffects::ArrayWriteOfType(Primitive::kPrimBoolean).ToString().c_str());
+      SideEffects::ArrayWriteOfType(DataType::Type::kBool).ToString().c_str());
   EXPECT_STREQ(
       "|||||C||",
-      SideEffects::ArrayWriteOfType(Primitive::kPrimChar).ToString().c_str());
+      SideEffects::ArrayWriteOfType(DataType::Type::kUint16).ToString().c_str());
   EXPECT_STREQ(
       "|||||S||",
-      SideEffects::ArrayWriteOfType(Primitive::kPrimShort).ToString().c_str());
+      SideEffects::ArrayWriteOfType(DataType::Type::kInt16).ToString().c_str());
   EXPECT_STREQ(
       "|||B||||",
-      SideEffects::FieldReadOfType(Primitive::kPrimByte, false).ToString().c_str());
+      SideEffects::FieldReadOfType(DataType::Type::kInt8, false).ToString().c_str());
   EXPECT_STREQ(
       "||D|||||",
-      SideEffects::ArrayReadOfType(Primitive::kPrimDouble).ToString().c_str());
+      SideEffects::ArrayReadOfType(DataType::Type::kFloat64).ToString().c_str());
   EXPECT_STREQ(
       "||J|||||",
-      SideEffects::ArrayReadOfType(Primitive::kPrimLong).ToString().c_str());
+      SideEffects::ArrayReadOfType(DataType::Type::kInt64).ToString().c_str());
   EXPECT_STREQ(
       "||F|||||",
-      SideEffects::ArrayReadOfType(Primitive::kPrimFloat).ToString().c_str());
+      SideEffects::ArrayReadOfType(DataType::Type::kFloat32).ToString().c_str());
   EXPECT_STREQ(
       "||I|||||",
-      SideEffects::ArrayReadOfType(Primitive::kPrimInt).ToString().c_str());
+      SideEffects::ArrayReadOfType(DataType::Type::kInt32).ToString().c_str());
   SideEffects s = SideEffects::None();
-  s = s.Union(SideEffects::FieldWriteOfType(Primitive::kPrimChar, /* is_volatile */ false));
-  s = s.Union(SideEffects::FieldWriteOfType(Primitive::kPrimLong, /* is_volatile */ false));
-  s = s.Union(SideEffects::ArrayWriteOfType(Primitive::kPrimShort));
-  s = s.Union(SideEffects::FieldReadOfType(Primitive::kPrimInt, /* is_volatile */ false));
-  s = s.Union(SideEffects::ArrayReadOfType(Primitive::kPrimFloat));
-  s = s.Union(SideEffects::ArrayReadOfType(Primitive::kPrimDouble));
+  s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kUint16, /* is_volatile */ false));
+  s = s.Union(SideEffects::FieldWriteOfType(DataType::Type::kInt64, /* is_volatile */ false));
+  s = s.Union(SideEffects::ArrayWriteOfType(DataType::Type::kInt16));
+  s = s.Union(SideEffects::FieldReadOfType(DataType::Type::kInt32, /* is_volatile */ false));
+  s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat32));
+  s = s.Union(SideEffects::ArrayReadOfType(DataType::Type::kFloat64));
   EXPECT_STREQ("||DF|I||S|JC|", s.ToString().c_str());
 }