diff --git a/llvm/utils/TableGen/CodeGenIntrinsics.h b/llvm/utils/TableGen/CodeGenIntrinsics.h
index 9d84d24..1c82e05 100644
--- a/llvm/utils/TableGen/CodeGenIntrinsics.h
+++ b/llvm/utils/TableGen/CodeGenIntrinsics.h
@@ -19,111 +19,104 @@
 #include <vector>
 
 namespace llvm {
-  class Record;
-  class RecordKeeper;
-  class CodeGenTarget;
+class Record;
+class RecordKeeper;
+class CodeGenTarget;
 
-  struct CodeGenIntrinsic {
-    Record *TheDef;            // The actual record defining this intrinsic.
-    std::string Name;          // The name of the LLVM function "llvm.bswap.i32"
-    std::string EnumName;      // The name of the enum "bswap_i32"
-    std::string GCCBuiltinName;// Name of the corresponding GCC builtin, or "".
-    std::string MSBuiltinName; // Name of the corresponding MS builtin, or "".
-    std::string TargetPrefix;  // Target prefix, e.g. "ppc" for t-s intrinsics.
+struct CodeGenIntrinsic {
+  Record *TheDef;             // The actual record defining this intrinsic.
+  std::string Name;           // The name of the LLVM function "llvm.bswap.i32"
+  std::string EnumName;       // The name of the enum "bswap_i32"
+  std::string GCCBuiltinName; // Name of the corresponding GCC builtin, or "".
+  std::string MSBuiltinName;  // Name of the corresponding MS builtin, or "".
+  std::string TargetPrefix;   // Target prefix, e.g. "ppc" for t-s intrinsics.
 
-    /// IntrinsicSignature - This structure holds the return values and
-    /// parameter values of an intrinsic. If the number of return values is > 1,
-    /// then the intrinsic implicitly returns a first-class aggregate. The
-    /// numbering of the types starts at 0 with the first return value and
-    /// continues from there through the parameter list. This is useful for
-    /// "matching" types.
-    struct IntrinsicSignature {
-      /// RetVTs - The MVT::SimpleValueType for each return type. Note that this
-      /// list is only populated when in the context of a target .td file. When
-      /// building Intrinsics.td, this isn't available, because we don't know
-      /// the target pointer size.
-      std::vector<MVT::SimpleValueType> RetVTs;
+  /// This structure holds the return values and parameter values of an
+  /// intrinsic. If the number of return values is > 1, then the intrinsic
+  /// implicitly returns a first-class aggregate. The numbering of the types
+  /// starts at 0 with the first return value and continues from there through
+  /// the parameter list. This is useful for "matching" types.
+  struct IntrinsicSignature {
+    /// The MVT::SimpleValueType for each return type. Note that this list is
+    /// only populated when in the context of a target .td file. When building
+    /// Intrinsics.td, this isn't available, because we don't know the target
+    /// pointer size.
+    std::vector<MVT::SimpleValueType> RetVTs;
 
-      /// RetTypeDefs - The records for each return type.
-      std::vector<Record*> RetTypeDefs;
+    /// The records for each return type.
+    std::vector<Record *> RetTypeDefs;
 
-      /// ParamVTs - The MVT::SimpleValueType for each parameter type. Note that
-      /// this list is only populated when in the context of a target .td file.
-      /// When building Intrinsics.td, this isn't available, because we don't
-      /// know the target pointer size.
-      std::vector<MVT::SimpleValueType> ParamVTs;
+    /// The MVT::SimpleValueType for each parameter type. Note that this list is
+    /// only populated when in the context of a target .td file.  When building
+    /// Intrinsics.td, this isn't available, because we don't know the target
+    /// pointer size.
+    std::vector<MVT::SimpleValueType> ParamVTs;
 
-      /// ParamTypeDefs - The records for each parameter type.
-      std::vector<Record*> ParamTypeDefs;
-    };
-
-    IntrinsicSignature IS;
-
-    /// Bit flags describing the type (ref/mod) and location of memory
-    /// accesses that may be performed by the intrinsics. Analogous to
-    /// \c FunctionModRefBehaviour.
-    enum ModRefBits {
-      /// The intrinsic may access memory anywhere, i.e. it is not restricted
-      /// to access through pointer arguments.
-      MR_Anywhere = 1,
-
-      /// The intrinsic may read memory.
-      MR_Ref = 2,
-
-      /// The intrinsic may write memory.
-      MR_Mod = 4,
-
-      /// The intrinsic may both read and write memory.
-      MR_ModRef = MR_Ref | MR_Mod,
-    };
-
-    /// Memory mod/ref behavior of this intrinsic, corresponding to
-    /// intrinsic properties (IntrReadMem, IntrArgMemOnly, etc.).
-    enum ModRefBehavior {
-      NoMem = 0,
-      ReadArgMem = MR_Ref,
-      ReadMem = MR_Ref | MR_Anywhere,
-      WriteArgMem = MR_Mod,
-      WriteMem = MR_Mod | MR_Anywhere,
-      ReadWriteArgMem = MR_ModRef,
-      ReadWriteMem = MR_ModRef | MR_Anywhere,
-    };
-    ModRefBehavior ModRef;
-
-    /// This is set to true if the intrinsic is overloaded by its argument
-    /// types.
-    bool isOverloaded;
-
-    /// isCommutative - True if the intrinsic is commutative.
-    bool isCommutative;
-
-    /// canThrow - True if the intrinsic can throw.
-    bool canThrow;
-
-    /// isNoDuplicate - True if the intrinsic is marked as noduplicate.
-    bool isNoDuplicate;
-
-    /// isNoReturn - True if the intrinsic is no-return.
-    bool isNoReturn;
-
-    /// isConvergent - True if the intrinsic is marked as convergent.
-    bool isConvergent;
-
-    enum ArgAttribute {
-      NoCapture,
-      ReadOnly,
-      WriteOnly,
-      ReadNone
-    };
-    std::vector<std::pair<unsigned, ArgAttribute> > ArgumentAttributes;
-
-    CodeGenIntrinsic(Record *R);
+    /// The records for each parameter type.
+    std::vector<Record *> ParamTypeDefs;
   };
 
-  /// LoadIntrinsics - Read all of the intrinsics defined in the specified
-  /// .td file.
-  std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC,
-                                               bool TargetOnly);
+  IntrinsicSignature IS;
+
+  /// Bit flags describing the type (ref/mod) and location of memory
+  /// accesses that may be performed by the intrinsics. Analogous to
+  /// \c FunctionModRefBehaviour.
+  enum ModRefBits {
+    /// The intrinsic may access memory anywhere, i.e. it is not restricted
+    /// to access through pointer arguments.
+    MR_Anywhere = 1,
+
+    /// The intrinsic may read memory.
+    MR_Ref = 2,
+
+    /// The intrinsic may write memory.
+    MR_Mod = 4,
+
+    /// The intrinsic may both read and write memory.
+    MR_ModRef = MR_Ref | MR_Mod,
+  };
+
+  /// Memory mod/ref behavior of this intrinsic, corresponding to intrinsic
+  /// properties (IntrReadMem, IntrArgMemOnly, etc.).
+  enum ModRefBehavior {
+    NoMem = 0,
+    ReadArgMem = MR_Ref,
+    ReadMem = MR_Ref | MR_Anywhere,
+    WriteArgMem = MR_Mod,
+    WriteMem = MR_Mod | MR_Anywhere,
+    ReadWriteArgMem = MR_ModRef,
+    ReadWriteMem = MR_ModRef | MR_Anywhere,
+  };
+  ModRefBehavior ModRef;
+
+  /// This is set to true if the intrinsic is overloaded by its argument
+  /// types.
+  bool isOverloaded;
+
+  /// True if the intrinsic is commutative.
+  bool isCommutative;
+
+  /// True if the intrinsic can throw.
+  bool canThrow;
+
+  /// True if the intrinsic is marked as noduplicate.
+  bool isNoDuplicate;
+
+  /// True if the intrinsic is no-return.
+  bool isNoReturn;
+
+  /// True if the intrinsic is marked as convergent.
+  bool isConvergent;
+
+  enum ArgAttribute { NoCapture, ReadOnly, WriteOnly, ReadNone };
+  std::vector<std::pair<unsigned, ArgAttribute>> ArgumentAttributes;
+
+  CodeGenIntrinsic(Record *R);
+};
+
+/// Read all of the intrinsics defined in the specified .td file.
+std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC,
+                                             bool TargetOnly);
 }
 
 #endif
