mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-26 21:47:07 +00:00
Implement an AliasSetTracker::copyValue method
llvm-svn: 16344
This commit is contained in:
parent
20b39fdfb9
commit
606caa617e
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user