Teach BasicAA to use the size parameter of the memory use marker intrinsics.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84174 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky
2009-10-15 06:12:11 +00:00
parent 549dda9d82
commit 2d3820c29c

View File

@@ -307,29 +307,40 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
return NoModRef; return NoModRef;
} }
if (TD) { if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction())) {
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction())) { switch (II->getIntrinsicID()) {
switch (II->getIntrinsicID()) { default: break;
default: break; case Intrinsic::atomic_cmp_swap:
case Intrinsic::atomic_cmp_swap: case Intrinsic::atomic_swap:
case Intrinsic::atomic_swap: case Intrinsic::atomic_load_add:
case Intrinsic::atomic_load_add: case Intrinsic::atomic_load_sub:
case Intrinsic::atomic_load_sub: case Intrinsic::atomic_load_and:
case Intrinsic::atomic_load_and: case Intrinsic::atomic_load_nand:
case Intrinsic::atomic_load_nand: case Intrinsic::atomic_load_or:
case Intrinsic::atomic_load_or: case Intrinsic::atomic_load_xor:
case Intrinsic::atomic_load_xor: case Intrinsic::atomic_load_max:
case Intrinsic::atomic_load_max: case Intrinsic::atomic_load_min:
case Intrinsic::atomic_load_min: case Intrinsic::atomic_load_umax:
case Intrinsic::atomic_load_umax: case Intrinsic::atomic_load_umin:
case Intrinsic::atomic_load_umin: { if (TD) {
Value *Op1 = II->getOperand(1); Value *Op1 = II->getOperand(1);
unsigned Op1Size = TD->getTypeStoreSize(Op1->getType()); unsigned Op1Size = TD->getTypeStoreSize(Op1->getType());
if (alias(Op1, Op1Size, P, Size) == NoAlias) if (alias(Op1, Op1Size, P, Size) == NoAlias)
return NoModRef; return NoModRef;
break;
}
} }
break;
case Intrinsic::lifetime_start:
case Intrinsic::lifetime_end:
case Intrinsic::invariant_start: {
unsigned PtrSize = cast<ConstantInt>(II->getOperand(1))->getZExtValue();
if (alias(II->getOperand(2), PtrSize, P, Size) == NoAlias)
return NoModRef;
}
case Intrinsic::invariant_end: {
unsigned PtrSize = cast<ConstantInt>(II->getOperand(2))->getZExtValue();
if (alias(II->getOperand(3), PtrSize, P, Size) == NoAlias)
return NoModRef;
}
} }
} }
} }