Teach basicaa about memcpy/memmove/memset. The length argument can be used to

improve alias results if constant, and the source pointer can't be modified.

llvm-svn: 84175
This commit is contained in:
Nick Lewycky 2009-10-15 07:11:24 +00:00
parent d7216cf74c
commit 9cec2380f2

View File

@ -310,6 +310,28 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction())) {
switch (II->getIntrinsicID()) {
default: break;
case Intrinsic::memcpy:
case Intrinsic::memmove: {
unsigned Len = ~0U;
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getOperand(3)))
Len = LenCI->getZExtValue();
Value *Dest = II->getOperand(1);
Value *Src = II->getOperand(2);
if (alias(Dest, Len, P, Size) == NoAlias) {
if (alias(Src, Len, P, Size) == NoAlias)
return NoModRef;
return Ref;
}
}
break;
case Intrinsic::memset:
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getOperand(3))) {
unsigned Len = LenCI->getZExtValue();
Value *Dest = II->getOperand(1);
if (alias(Dest, Len, P, Size) == NoAlias)
return NoModRef;
}
break;
case Intrinsic::atomic_cmp_swap:
case Intrinsic::atomic_swap:
case Intrinsic::atomic_load_add: