From fb8096dee5df60f156e770b9f96f8417e9dbd4c9 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 18 Oct 2010 21:28:00 +0000 Subject: [PATCH] Don't pass the raw invalid pointer used to represent conflicting 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 | 17 +++++++++++- lib/Analysis/AliasSetTracker.cpp | 8 +++--- test/Analysis/TypeBasedAliasAnalysis/licm.ll | 28 ++++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/include/llvm/Analysis/AliasSetTracker.h b/include/llvm/Analysis/AliasSetTracker.h index d3e8c727ed3..452724c42b8 100644 --- a/include/llvm/Analysis/AliasSetTracker.h +++ b/include/llvm/Analysis/AliasSetTracker.h @@ -67,7 +67,21 @@ class AliasSet : public ilist_node { 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(-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 diff --git a/lib/Analysis/AliasSetTracker.cpp b/lib/Analysis/AliasSetTracker.cpp index 0f13af6ab06..2488b48cfc1 100644 --- a/lib/Analysis/AliasSetTracker.cpp +++ b/lib/Analysis/AliasSetTracker.cpp @@ -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); } diff --git a/test/Analysis/TypeBasedAliasAnalysis/licm.ll b/test/Analysis/TypeBasedAliasAnalysis/licm.ll index eedc1e85891..aa0ebdb6488 100644 --- a/test/Analysis/TypeBasedAliasAnalysis/licm.ll +++ b/test/Analysis/TypeBasedAliasAnalysis/licm.ll @@ -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}