mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 22:04:55 +00:00
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
This commit is contained in:
parent
2d3820c29c
commit
6e9e010752
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user