From 606caa617e49f59b343478a9a43a8c4a0bfe3e54 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 14 Sep 2004 19:15:32 +0000 Subject: [PATCH] Implement an AliasSetTracker::copyValue method llvm-svn: 16344 --- lib/Analysis/AliasSetTracker.cpp | 33 +++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/Analysis/AliasSetTracker.cpp b/lib/Analysis/AliasSetTracker.cpp index e5f7f32f9c7..15b4945c592 100644 --- a/lib/Analysis/AliasSetTracker.cpp +++ b/lib/Analysis/AliasSetTracker.cpp @@ -67,12 +67,13 @@ void AliasSet::removeFromTracker(AliasSetTracker &AST) { } void AliasSet::addPointer(AliasSetTracker &AST, HashNodePair &Entry, - unsigned Size) { + unsigned Size, bool KnownMustAlias) { assert(!Entry.second.hasAliasSet() && "Entry already in set!"); AliasAnalysis &AA = AST.getAliasAnalysis(); - if (isMustAlias()) // Check to see if we have to downgrade to _may_ alias + // Check to see if we have to downgrade to _may_ alias. + if (isMustAlias() && !KnownMustAlias) if (HashNodePair *P = getSomePointer()) { AliasAnalysis::AliasResult Result = AA.alias(P->first, P->second.getSize(), Entry.first, Size); @@ -400,7 +401,10 @@ bool AliasSetTracker::remove(Instruction *I) { // dangling pointers to deleted instructions. // void AliasSetTracker::deleteValue(Value *PtrVal) { - // First, look up the PointerRec for this pointer... + // Notify the alias analysis implementation that this value is gone. + AA.deleteValue(PtrVal); + + // First, look up the PointerRec for this pointer. hash_map::iterator I = PointerMap.find(PtrVal); if (I == PointerMap.end()) return; // Noop @@ -415,6 +419,29 @@ void AliasSetTracker::deleteValue(Value *PtrVal) { PointerMap.erase(I); } +// copyValue - This method should be used whenever a preexisting value in the +// program is copied or cloned, introducing a new value. Note that it is ok for +// clients that use this method to introduce the same value multiple times: if +// the tracker already knows about a value, it will ignore the request. +// +void AliasSetTracker::copyValue(Value *From, Value *To) { + // Notify the alias analysis implementation that this value is copied. + AA.copyValue(From, To); + + // First, look up the PointerRec for this pointer. + hash_map::iterator I = PointerMap.find(From); + if (I == PointerMap.end() || !I->second.hasAliasSet()) + return; // Noop + + AliasSet::HashNodePair &Entry = getEntryFor(To); + if (Entry.second.hasAliasSet()) return; // Already in the tracker! + + // Add it to the alias set it aliases... + AliasSet *AS = I->second.getAliasSet(*this); + AS->addPointer(*this, Entry, I->second.getSize(), true); +} + + //===----------------------------------------------------------------------===// // AliasSet/AliasSetTracker Printing Support