From: Nick Lewycky Date: Thu, 15 Oct 2009 07:11:24 +0000 (+0000) Subject: Teach basicaa about memcpy/memmove/memset. The length argument can be used to X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=6e9e010752e475c27d929147dc07d6261fc0f0f1;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84175 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index a0306663e8a..c5be6167e06 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -310,6 +310,28 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) { if (IntrinsicInst *II = dyn_cast(CS.getInstruction())) { switch (II->getIntrinsicID()) { default: break; + case Intrinsic::memcpy: + case Intrinsic::memmove: { + unsigned Len = ~0U; + if (ConstantInt *LenCI = dyn_cast(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(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: