class LoadInst;
class StoreInst;
class FreeInst;
+class VAArgInst;
class AliasSetTracker;
class AliasSet;
bool add(LoadInst *LI);
bool add(StoreInst *SI);
bool add(FreeInst *FI);
+ bool add(VAArgInst *VAAI);
bool add(CallSite CS); // Call/Invoke instructions
bool add(CallInst *CI) { return add(CallSite(CI)); }
bool add(InvokeInst *II) { return add(CallSite(II)); }
bool remove(LoadInst *LI);
bool remove(StoreInst *SI);
bool remove(FreeInst *FI);
+ bool remove(VAArgInst *VAAI);
bool remove(CallSite CS);
bool remove(CallInst *CI) { return remove(CallSite(CI)); }
bool remove(InvokeInst *II) { return remove(CallSite(II)); }
return NewPtr;
}
+bool AliasSetTracker::add(VAArgInst *VAAI) {
+ bool NewPtr;
+ addPointer(VAAI->getOperand(0), ~0, AliasSet::ModRef, NewPtr);
+ return NewPtr;
+}
+
bool AliasSetTracker::add(CallSite CS) {
if (AA.doesNotAccessMemory(CS))
return add(II);
else if (FreeInst *FI = dyn_cast<FreeInst>(I))
return add(FI);
+ else if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I))
+ return add(VAAI);
return true;
}
return true;
}
+bool AliasSetTracker::remove(VAArgInst *VAAI) {
+ AliasSet *AS = findAliasSetForPointer(VAAI->getOperand(0), ~0);
+ if (!AS) return false;
+ remove(*AS);
+ return true;
+}
+
bool AliasSetTracker::remove(CallSite CS) {
if (AA.doesNotAccessMemory(CS))
return false; // doesn't alias anything
return remove(CI);
else if (FreeInst *FI = dyn_cast<FreeInst>(I))
return remove(FI);
+ else if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I))
+ return remove(VAAI);
return true;
}