Make the representation of AliasSets explicitly differentiate
authorDan Gohman <gohman@apple.com>
Mon, 18 Oct 2010 23:31:47 +0000 (23:31 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 18 Oct 2010 23:31:47 +0000 (23:31 +0000)
between "not known yet" and "known no tbaa info" so that it
can merge them properly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116767 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/AliasSetTracker.h
lib/Analysis/AliasSetTracker.cpp

index 452724c42b8d5e44265ce1329f4a04e6e0d936d7..f66b3b70e2bc1b60e5c040e2f96a51b1b9053175 100644 (file)
@@ -44,7 +44,8 @@ class AliasSet : public ilist_node<AliasSet> {
     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 @@ class AliasSet : public ilist_node<AliasSet> {
     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 @@ public:
 
     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
index 2488b48cfc1e1f15b4ff2ac5e6dbecc940d13772..2fd5acd051c59e30e713e1aebb47b2d0ea759e86 100644 (file)
@@ -377,7 +377,7 @@ void AliasSetTracker::add(const AliasSetTracker &AST) {
     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 @@ void AliasSetTracker::copyValue(Value *From, Value *To) {
   I = PointerMap.find(From);
   AliasSet *AS = I->second->getAliasSet(*this);
   AS->addPointer(*this, Entry, I->second->getSize(),
-                 I->second->getRawTBAAInfo(),
+                 I->second->getTBAAInfo(),
                  true);
 }