Implement an AliasSetTracker::copyValue method

llvm-svn: 16344
This commit is contained in:
Chris Lattner 2004-09-14 19:15:32 +00:00
parent 20b39fdfb9
commit 606caa617e

View File

@ -67,12 +67,13 @@ void AliasSet::removeFromTracker(AliasSetTracker &AST) {
} }
void AliasSet::addPointer(AliasSetTracker &AST, HashNodePair &Entry, void AliasSet::addPointer(AliasSetTracker &AST, HashNodePair &Entry,
unsigned Size) { unsigned Size, bool KnownMustAlias) {
assert(!Entry.second.hasAliasSet() && "Entry already in set!"); assert(!Entry.second.hasAliasSet() && "Entry already in set!");
AliasAnalysis &AA = AST.getAliasAnalysis(); 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()) { if (HashNodePair *P = getSomePointer()) {
AliasAnalysis::AliasResult Result = AliasAnalysis::AliasResult Result =
AA.alias(P->first, P->second.getSize(), Entry.first, Size); AA.alias(P->first, P->second.getSize(), Entry.first, Size);
@ -400,7 +401,10 @@ bool AliasSetTracker::remove(Instruction *I) {
// dangling pointers to deleted instructions. // dangling pointers to deleted instructions.
// //
void AliasSetTracker::deleteValue(Value *PtrVal) { 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<Value*, AliasSet::PointerRec>::iterator I = PointerMap.find(PtrVal); hash_map<Value*, AliasSet::PointerRec>::iterator I = PointerMap.find(PtrVal);
if (I == PointerMap.end()) return; // Noop if (I == PointerMap.end()) return; // Noop
@ -415,6 +419,29 @@ void AliasSetTracker::deleteValue(Value *PtrVal) {
PointerMap.erase(I); 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<Value*, AliasSet::PointerRec>::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 // AliasSet/AliasSetTracker Printing Support