From: Chris Lattner Date: Tue, 14 Sep 2004 19:15:32 +0000 (+0000) Subject: Implement an AliasSetTracker::copyValue method X-Git-Tag: android-x86-6.0-r1~1003^2~52876 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b66e648e95a9c2d29c33297b0499b00d31b660c0;p=android-x86%2Fexternal-llvm.git Implement an AliasSetTracker::copyValue method git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16344 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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