diff --git a/utils/TableGen/CodeGenTarget.cpp b/utils/TableGen/CodeGenTarget.cpp
index 0849d4f..15aa2de 100644
--- a/utils/TableGen/CodeGenTarget.cpp
+++ b/utils/TableGen/CodeGenTarget.cpp
@@ -30,62 +30,62 @@
 AsmWriterNum("asmwriternum", cl::init(0),
              cl::desc("Make -gen-asm-writer emit assembly writer #N"));
 
-/// getValueType - Return the MVT::SimpleValueType that the specified TableGen
+/// getValueType - Return the EVT::SimpleValueType that the specified TableGen
 /// record corresponds to.
-MVT::SimpleValueType llvm::getValueType(Record *Rec) {
-  return (MVT::SimpleValueType)Rec->getValueAsInt("Value");
+EVT::SimpleValueType llvm::getValueType(Record *Rec) {
+  return (EVT::SimpleValueType)Rec->getValueAsInt("Value");
 }
 
-std::string llvm::getName(MVT::SimpleValueType T) {
+std::string llvm::getName(EVT::SimpleValueType T) {
   switch (T) {
-  case MVT::Other:   return "UNKNOWN";
-  case MVT::iPTR:    return "TLI.getPointerTy()";
-  case MVT::iPTRAny: return "TLI.getPointerTy()";
+  case EVT::Other:   return "UNKNOWN";
+  case EVT::iPTR:    return "TLI.getPointerTy()";
+  case EVT::iPTRAny: return "TLI.getPointerTy()";
   default: return getEnumName(T);
   }
 }
 
-std::string llvm::getEnumName(MVT::SimpleValueType T) {
+std::string llvm::getEnumName(EVT::SimpleValueType T) {
   switch (T) {
-  case MVT::Other: return "MVT::Other";
-  case MVT::i1:    return "MVT::i1";
-  case MVT::i8:    return "MVT::i8";
-  case MVT::i16:   return "MVT::i16";
-  case MVT::i32:   return "MVT::i32";
-  case MVT::i64:   return "MVT::i64";
-  case MVT::i128:  return "MVT::i128";
-  case MVT::iAny:  return "MVT::iAny";
-  case MVT::fAny:  return "MVT::fAny";
-  case MVT::f32:   return "MVT::f32";
-  case MVT::f64:   return "MVT::f64";
-  case MVT::f80:   return "MVT::f80";
-  case MVT::f128:  return "MVT::f128";
-  case MVT::ppcf128:  return "MVT::ppcf128";
-  case MVT::Flag:  return "MVT::Flag";
-  case MVT::isVoid:return "MVT::isVoid";
-  case MVT::v2i8:  return "MVT::v2i8";
-  case MVT::v4i8:  return "MVT::v4i8";
-  case MVT::v8i8:  return "MVT::v8i8";
-  case MVT::v16i8: return "MVT::v16i8";
-  case MVT::v32i8: return "MVT::v32i8";
-  case MVT::v2i16: return "MVT::v2i16";
-  case MVT::v4i16: return "MVT::v4i16";
-  case MVT::v8i16: return "MVT::v8i16";
-  case MVT::v16i16: return "MVT::v16i16";
-  case MVT::v2i32: return "MVT::v2i32";
-  case MVT::v4i32: return "MVT::v4i32";
-  case MVT::v8i32: return "MVT::v8i32";
-  case MVT::v1i64: return "MVT::v1i64";
-  case MVT::v2i64: return "MVT::v2i64";
-  case MVT::v4i64: return "MVT::v4i64";
-  case MVT::v2f32: return "MVT::v2f32";
-  case MVT::v4f32: return "MVT::v4f32";
-  case MVT::v8f32: return "MVT::v8f32";
-  case MVT::v2f64: return "MVT::v2f64";
-  case MVT::v4f64: return "MVT::v4f64";
-  case MVT::Metadata: return "MVT::Metadata";
-  case MVT::iPTR:  return "MVT::iPTR";
-  case MVT::iPTRAny:  return "MVT::iPTRAny";
+  case EVT::Other: return "EVT::Other";
+  case EVT::i1:    return "EVT::i1";
+  case EVT::i8:    return "EVT::i8";
+  case EVT::i16:   return "EVT::i16";
+  case EVT::i32:   return "EVT::i32";
+  case EVT::i64:   return "EVT::i64";
+  case EVT::i128:  return "EVT::i128";
+  case EVT::iAny:  return "EVT::iAny";
+  case EVT::fAny:  return "EVT::fAny";
+  case EVT::f32:   return "EVT::f32";
+  case EVT::f64:   return "EVT::f64";
+  case EVT::f80:   return "EVT::f80";
+  case EVT::f128:  return "EVT::f128";
+  case EVT::ppcf128:  return "EVT::ppcf128";
+  case EVT::Flag:  return "EVT::Flag";
+  case EVT::isVoid:return "EVT::isVoid";
+  case EVT::v2i8:  return "EVT::v2i8";
+  case EVT::v4i8:  return "EVT::v4i8";
+  case EVT::v8i8:  return "EVT::v8i8";
+  case EVT::v16i8: return "EVT::v16i8";
+  case EVT::v32i8: return "EVT::v32i8";
+  case EVT::v2i16: return "EVT::v2i16";
+  case EVT::v4i16: return "EVT::v4i16";
+  case EVT::v8i16: return "EVT::v8i16";
+  case EVT::v16i16: return "EVT::v16i16";
+  case EVT::v2i32: return "EVT::v2i32";
+  case EVT::v4i32: return "EVT::v4i32";
+  case EVT::v8i32: return "EVT::v8i32";
+  case EVT::v1i64: return "EVT::v1i64";
+  case EVT::v2i64: return "EVT::v2i64";
+  case EVT::v4i64: return "EVT::v4i64";
+  case EVT::v2f32: return "EVT::v2f32";
+  case EVT::v4f32: return "EVT::v4f32";
+  case EVT::v8f32: return "EVT::v8f32";
+  case EVT::v2f64: return "EVT::v2f64";
+  case EVT::v4f64: return "EVT::v4f64";
+  case EVT::Metadata: return "EVT::Metadata";
+  case EVT::iPTR:  return "EVT::iPTR";
+  case EVT::iPTRAny:  return "EVT::iPTRAny";
   default: assert(0 && "ILLEGAL VALUE TYPE!"); return "";
   }
 }
@@ -190,7 +190,7 @@
     const CodeGenRegisterClass &RC = RegisterClasses[i];
     for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) {
       if (R == RC.Elements[ei]) {
-        const std::vector<MVT::SimpleValueType> &InVTs = RC.getValueTypes();
+        const std::vector<EVT::SimpleValueType> &InVTs = RC.getValueTypes();
         for (unsigned i = 0, e = InVTs.size(); i != e; ++i)
           Result.push_back(InVTs[i]);
       }
@@ -240,7 +240,7 @@
   unsigned Size = R->getValueAsInt("Size");
 
   Namespace = R->getValueAsString("Namespace");
-  SpillSize = Size ? Size : MVT(VTs[0]).getSizeInBits();
+  SpillSize = Size ? Size : EVT(VTs[0]).getSizeInBits();
   SpillAlignment = R->getValueAsInt("Alignment");
   CopyCost = R->getValueAsInt("CopyCost");
   MethodBodies = R->getValueAsCode("MethodBodies");
@@ -476,12 +476,12 @@
   }
   
   // Parse the list of return types.
-  std::vector<MVT::SimpleValueType> OverloadedVTs;
+  std::vector<EVT::SimpleValueType> OverloadedVTs;
   ListInit *TypeList = R->getValueAsListInit("RetTypes");
   for (unsigned i = 0, e = TypeList->getSize(); i != e; ++i) {
     Record *TyEl = TypeList->getElementAsRecord(i);
     assert(TyEl->isSubClassOf("LLVMType") && "Expected a type!");
-    MVT::SimpleValueType VT;
+    EVT::SimpleValueType VT;
     if (TyEl->isSubClassOf("LLVMMatchType")) {
       unsigned MatchTy = TyEl->getValueAsInt("Number");
       assert(MatchTy < OverloadedVTs.size() &&
@@ -492,11 +492,11 @@
       // overloaded, all the types can be specified directly.
       assert(((!TyEl->isSubClassOf("LLVMExtendedElementVectorType") &&
                !TyEl->isSubClassOf("LLVMTruncatedElementVectorType")) ||
-              VT == MVT::iAny) && "Expected iAny type");
+              VT == EVT::iAny) && "Expected iAny type");
     } else {
       VT = getValueType(TyEl->getValueAsDef("VT"));
     }
-    if (VT == MVT::iAny || VT == MVT::fAny || VT == MVT::iPTRAny) {
+    if (VT == EVT::iAny || VT == EVT::fAny || VT == EVT::iPTRAny) {
       OverloadedVTs.push_back(VT);
       isOverloaded |= true;
     }
@@ -512,7 +512,7 @@
   for (unsigned i = 0, e = TypeList->getSize(); i != e; ++i) {
     Record *TyEl = TypeList->getElementAsRecord(i);
     assert(TyEl->isSubClassOf("LLVMType") && "Expected a type!");
-    MVT::SimpleValueType VT;
+    EVT::SimpleValueType VT;
     if (TyEl->isSubClassOf("LLVMMatchType")) {
       unsigned MatchTy = TyEl->getValueAsInt("Number");
       assert(MatchTy < OverloadedVTs.size() &&
@@ -523,10 +523,10 @@
       // overloaded, all the types can be specified directly.
       assert(((!TyEl->isSubClassOf("LLVMExtendedElementVectorType") &&
                !TyEl->isSubClassOf("LLVMTruncatedElementVectorType")) ||
-              VT == MVT::iAny) && "Expected iAny type");
+              VT == EVT::iAny) && "Expected iAny type");
     } else
       VT = getValueType(TyEl->getValueAsDef("VT"));
-    if (VT == MVT::iAny || VT == MVT::fAny || VT == MVT::iPTRAny) {
+    if (VT == EVT::iAny || VT == EVT::fAny || VT == EVT::iPTRAny) {
       OverloadedVTs.push_back(VT);
       isOverloaded |= true;
     }
