diff --git a/include/llvm/Analysis/AliasSetTracker.h b/include/llvm/Analysis/AliasSetTracker.h
index 452724c..f66b3b7 100644
--- a/include/llvm/Analysis/AliasSetTracker.h
+++ b/include/llvm/Analysis/AliasSetTracker.h
@@ -44,7 +44,8 @@
     const MDNode *TBAAInfo;
   public:
     PointerRec(Value *V)
-      : Val(V), PrevInList(0), NextInList(0), AS(0), Size(0), TBAAInfo(0) {}
+      : Val(V), PrevInList(0), NextInList(0), AS(0), Size(0),
+        TBAAInfo(DenseMapInfo<const MDNode *>::getEmptyKey()) {}
 
     Value *getValue() const { return Val; }
     
@@ -59,26 +60,22 @@
     void updateSizeAndTBAAInfo(unsigned NewSize, const MDNode *NewTBAAInfo) {
       if (NewSize > Size) Size = NewSize;
 
-      if (!TBAAInfo)
+      if (TBAAInfo == DenseMapInfo<const MDNode *>::getEmptyKey())
+        // We don't have a TBAAInfo yet. Set it to NewTBAAInfo.
         TBAAInfo = NewTBAAInfo;
       else if (TBAAInfo != NewTBAAInfo)
-        TBAAInfo = reinterpret_cast<const MDNode *>(-1);
+        // NewTBAAInfo conflicts with TBAAInfo.
+        TBAAInfo = DenseMapInfo<const MDNode *>::getTombstoneKey();
     }
 
     unsigned getSize() const { return Size; }
 
-    /// getRawTBAAInfo - Return the raw TBAAInfo member. In addition to
-    /// being null or a pointer to an MDNode, this could be -1, meaning
-    /// there was conflicting information.
-    const MDNode *getRawTBAAInfo() const {
-      return TBAAInfo;
-    }
-
     /// getTBAAInfo - Return the TBAAInfo, or null if there is no
     /// information or conflicting information.
     const MDNode *getTBAAInfo() const {
-      // If we have conflicting TBAAInfo, return null.
-      if (TBAAInfo == reinterpret_cast<const MDNode *>(-1))
+      // If we have missing or conflicting TBAAInfo, return null.
+      if (TBAAInfo == DenseMapInfo<const MDNode *>::getEmptyKey() ||
+          TBAAInfo == DenseMapInfo<const MDNode *>::getTombstoneKey())
         return 0;
       return TBAAInfo;
     }
@@ -209,7 +206,6 @@
 
     Value *getPointer() const { return CurNode->getValue(); }
     unsigned getSize() const { return CurNode->getSize(); }
-    const MDNode *getRawTBAAInfo() const { return CurNode->getRawTBAAInfo(); }
     const MDNode *getTBAAInfo() const { return CurNode->getTBAAInfo(); }
 
     iterator& operator++() {                // Preincrement
diff --git a/lib/Analysis/AliasSetTracker.cpp b/lib/Analysis/AliasSetTracker.cpp
index 2488b48..2fd5acd 100644
--- a/lib/Analysis/AliasSetTracker.cpp
+++ b/lib/Analysis/AliasSetTracker.cpp
@@ -377,7 +377,7 @@
     bool X;
     for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) {
       AliasSet &NewAS = addPointer(ASI.getPointer(), ASI.getSize(),
-                                   ASI.getRawTBAAInfo(),
+                                   ASI.getTBAAInfo(),
                                    (AliasSet::AccessType)AS.AccessTy, X);
       if (AS.isVolatile()) NewAS.setVolatile();
     }
@@ -533,7 +533,7 @@
   I = PointerMap.find(From);
   AliasSet *AS = I->second->getAliasSet(*this);
   AS->addPointer(*this, Entry, I->second->getSize(),
-                 I->second->getRawTBAAInfo(),
+                 I->second->getTBAAInfo(),
                  true);
 }
 
