Make the representation of AliasSets explicitly differentiate

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
This commit is contained in:
Dan Gohman 2010-10-18 23:31:47 +00:00
parent 1be4ab681e
commit eee5400442
2 changed files with 11 additions and 15 deletions

View File

@ -44,7 +44,8 @@ class AliasSet : public ilist_node<AliasSet> {
const MDNode *TBAAInfo; const MDNode *TBAAInfo;
public: public:
PointerRec(Value *V) 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; } Value *getValue() const { return Val; }
@ -59,26 +60,22 @@ class AliasSet : public ilist_node<AliasSet> {
void updateSizeAndTBAAInfo(unsigned NewSize, const MDNode *NewTBAAInfo) { void updateSizeAndTBAAInfo(unsigned NewSize, const MDNode *NewTBAAInfo) {
if (NewSize > Size) Size = NewSize; 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; TBAAInfo = NewTBAAInfo;
else if (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; } 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 /// getTBAAInfo - Return the TBAAInfo, or null if there is no
/// information or conflicting information. /// information or conflicting information.
const MDNode *getTBAAInfo() const { const MDNode *getTBAAInfo() const {
// If we have conflicting TBAAInfo, return null. // If we have missing or conflicting TBAAInfo, return null.
if (TBAAInfo == reinterpret_cast<const MDNode *>(-1)) if (TBAAInfo == DenseMapInfo<const MDNode *>::getEmptyKey() ||
TBAAInfo == DenseMapInfo<const MDNode *>::getTombstoneKey())
return 0; return 0;
return TBAAInfo; return TBAAInfo;
} }
@ -209,7 +206,6 @@ public:
Value *getPointer() const { return CurNode->getValue(); } Value *getPointer() const { return CurNode->getValue(); }
unsigned getSize() const { return CurNode->getSize(); } unsigned getSize() const { return CurNode->getSize(); }
const MDNode *getRawTBAAInfo() const { return CurNode->getRawTBAAInfo(); }
const MDNode *getTBAAInfo() const { return CurNode->getTBAAInfo(); } const MDNode *getTBAAInfo() const { return CurNode->getTBAAInfo(); }
iterator& operator++() { // Preincrement iterator& operator++() { // Preincrement

View File

@ -377,7 +377,7 @@ void AliasSetTracker::add(const AliasSetTracker &AST) {
bool X; bool X;
for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) { for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) {
AliasSet &NewAS = addPointer(ASI.getPointer(), ASI.getSize(), AliasSet &NewAS = addPointer(ASI.getPointer(), ASI.getSize(),
ASI.getRawTBAAInfo(), ASI.getTBAAInfo(),
(AliasSet::AccessType)AS.AccessTy, X); (AliasSet::AccessType)AS.AccessTy, X);
if (AS.isVolatile()) NewAS.setVolatile(); if (AS.isVolatile()) NewAS.setVolatile();
} }
@ -533,7 +533,7 @@ void AliasSetTracker::copyValue(Value *From, Value *To) {
I = PointerMap.find(From); I = PointerMap.find(From);
AliasSet *AS = I->second->getAliasSet(*this); AliasSet *AS = I->second->getAliasSet(*this);
AS->addPointer(*this, Entry, I->second->getSize(), AS->addPointer(*this, Entry, I->second->getSize(),
I->second->getRawTBAAInfo(), I->second->getTBAAInfo(),
true); true);
} }