Don't pass the raw invalid pointer used to represent conflicting
authorDan Gohman <gohman@apple.com>
Mon, 18 Oct 2010 21:28:00 +0000 (21:28 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 18 Oct 2010 21:28:00 +0000 (21:28 +0000)
TBAA information to AliasAnalysis.

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

include/llvm/Analysis/AliasSetTracker.h
lib/Analysis/AliasSetTracker.cpp
test/Analysis/TypeBasedAliasAnalysis/licm.ll

index d3e8c727ed306122131ea13ef8bbf1ffd3254d35..452724c42b8d5e44265ce1329f4a04e6e0d936d7 100644 (file)
@@ -67,7 +67,21 @@ class AliasSet : public ilist_node<AliasSet> {
 
     unsigned getSize() const { return Size; }
 
-    const MDNode *getTBAAInfo() const { return TBAAInfo; }
+    /// 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))
+        return 0;
+      return TBAAInfo;
+    }
 
     AliasSet *getAliasSet(AliasSetTracker &AST) {
       assert(AS && "No AliasSet yet!");
@@ -195,6 +209,7 @@ 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 0f13af6ab066ff2fc0ff5bf45e75f57e8cf71397..2488b48cfc1e1f15b4ff2ac5e6dbecc940d13772 100644 (file)
@@ -158,7 +158,8 @@ bool AliasSet::aliasesPointer(const Value *Ptr, unsigned Size,
   // to be sure it doesn't alias the set...
   for (iterator I = begin(), E = end(); I != E; ++I)
     if (AA.alias(AliasAnalysis::Location(Ptr, Size, TBAAInfo),
-                 AliasAnalysis::Location(I.getPointer(), I.getSize(), I.getTBAAInfo())))
+                 AliasAnalysis::Location(I.getPointer(), I.getSize(),
+                                         I.getTBAAInfo())))
       return true;
 
   // Check the call sites list and invoke list...
@@ -376,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.getTBAAInfo(),
+                                   ASI.getRawTBAAInfo(),
                                    (AliasSet::AccessType)AS.AccessTy, X);
       if (AS.isVolatile()) NewAS.setVolatile();
     }
@@ -531,7 +532,8 @@ void AliasSetTracker::copyValue(Value *From, Value *To) {
   // Add it to the alias set it aliases...
   I = PointerMap.find(From);
   AliasSet *AS = I->second->getAliasSet(*this);
-  AS->addPointer(*this, Entry, I->second->getSize(), I->second->getTBAAInfo(),
+  AS->addPointer(*this, Entry, I->second->getSize(),
+                 I->second->getRawTBAAInfo(),
                  true);
 }
 
index eedc1e85891a721cbae72245ed5405e843e01f2c..aa0ebdb648818be91e4085520561251cb5d372cf 100644 (file)
@@ -3,6 +3,7 @@
 ; LICM should be able to hoist the address load out of the loop
 ; by using TBAA information.
 
+; CHECK: @foo
 ; CHECK:      entry:
 ; CHECK-NEXT:   %tmp3 = load double** @P, !tbaa !0
 ; CHECK-NEXT:   br label %for.body
@@ -31,3 +32,30 @@ for.end:                                          ; preds = %for.body, %entry
 !0 = metadata !{metadata !"root", null}
 !1 = metadata !{metadata !"pointer", metadata !0}
 !2 = metadata !{metadata !"double", metadata !0}
+
+; LICM shouldn't hoist anything here.
+
+; CHECK: @bar
+; CHECK: loop:
+; CHECK: load
+; CHECK: store
+; CHECK: load
+; CHECK: store
+; CHECK: br label %loop
+
+define void @bar(i8** %p) nounwind {
+entry:
+  %q = bitcast i8** %p to i8*
+  br label %loop
+
+loop:
+  %tmp51 = load i8** %p, !tbaa !4
+  store i8* %tmp51, i8** %p
+  %tmp40 = load i8* %q, !tbaa !5
+  store i8 %tmp40, i8* %q
+  br label %loop
+}
+
+!3 = metadata !{metadata !"pointer", metadata !4}
+!4 = metadata !{metadata !"char", metadata !5}
+!5 = metadata !{metadata !"root", null}