1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

Add capability to remove aliasing aliassets from an AST

llvm-svn: 15066
This commit is contained in:
Chris Lattner 2004-07-21 07:04:26 +00:00
parent 67c1deddfc
commit 195950df76

View File

@ -290,6 +290,62 @@ void AliasSetTracker::add(const AliasSetTracker &AST) {
}
}
/// remove - Remove the specified (potentially non-empty) alias set from the
/// tracker.
void AliasSetTracker::remove(AliasSet &AS) {
bool SetDead;
do {
AliasSet::iterator I = AS.begin();
Value *Ptr = I.getPointer(); ++I;
// deleteValue will delete the set automatically when the last pointer
// reference is destroyed. "Predict" when this will happen.
SetDead = I == AS.end();
deleteValue(Ptr); // Delete all of the pointers from the set
} while (!SetDead);
}
bool AliasSetTracker::remove(LoadInst *LI) {
unsigned Size = AA.getTargetData().getTypeSize(LI->getType());
AliasSet *AS = findAliasSetForPointer(LI->getOperand(0), Size);
if (!AS) return false;
remove(*AS);
return true;
}
bool AliasSetTracker::remove(StoreInst *SI) {
unsigned Size = AA.getTargetData().getTypeSize(SI->getOperand(0)->getType());
AliasSet *AS = findAliasSetForPointer(SI->getOperand(1), Size);
if (!AS) return false;
remove(*AS);
return true;
}
bool AliasSetTracker::remove(CallSite CS) {
if (Function *F = CS.getCalledFunction())
if (AA.doesNotAccessMemory(F))
return false; // doesn't alias anything
AliasSet *AS = findAliasSetForCallSite(CS);
if (!AS) return false;
remove(*AS);
return true;
}
bool AliasSetTracker::remove(Instruction *I) {
// Dispatch to one of the other remove methods...
if (LoadInst *LI = dyn_cast<LoadInst>(I))
return remove(LI);
else if (StoreInst *SI = dyn_cast<StoreInst>(I))
return remove(SI);
else if (CallInst *CI = dyn_cast<CallInst>(I))
return remove(CI);
else if (InvokeInst *II = dyn_cast<InvokeInst>(I))
return remove(II);
return true;
}
// deleteValue method - This method is used to remove a pointer value from the
// AliasSetTracker entirely. It should be used when an instruction is deleted