forked from OSchip/llvm-project
Teach BasicAA a little something about the atomic intrinsics: they can only
modify through the pointer they're given. llvm-svn: 83959
This commit is contained in:
parent
3eb172a02b
commit
e2782c7614
|
@ -284,6 +284,27 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
|
|||
if (!passedAsArg)
|
||||
return NoModRef;
|
||||
}
|
||||
|
||||
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction())) {
|
||||
switch (II->getIntrinsicID()) {
|
||||
default: break;
|
||||
case Intrinsic::atomic_cmp_swap:
|
||||
case Intrinsic::atomic_swap:
|
||||
case Intrinsic::atomic_load_add:
|
||||
case Intrinsic::atomic_load_sub:
|
||||
case Intrinsic::atomic_load_and:
|
||||
case Intrinsic::atomic_load_nand:
|
||||
case Intrinsic::atomic_load_or:
|
||||
case Intrinsic::atomic_load_xor:
|
||||
case Intrinsic::atomic_load_max:
|
||||
case Intrinsic::atomic_load_min:
|
||||
case Intrinsic::atomic_load_umax:
|
||||
case Intrinsic::atomic_load_umin:
|
||||
if (alias(II->getOperand(1), Size, P, Size) == NoAlias)
|
||||
return NoModRef;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The AliasAnalysis base class has some smarts, lets use them.
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
; RUN: opt -gvn -S < %s | FileCheck %s
|
||||
|
||||
declare i8 @llvm.atomic.load.add.i8.p0i8(i8*, i8)
|
||||
|
||||
define void @foo(i8* %ptr) {
|
||||
%P = getelementptr i8* %ptr, i32 0
|
||||
%Q = getelementptr i8* %ptr, i32 1
|
||||
; CHECK: getelementptr
|
||||
%X = load i8* %P
|
||||
; CHECK: = load
|
||||
%Y = call i8 @llvm.atomic.load.add.i8.p0i8(i8* %Q, i8 1)
|
||||
%Z = load i8* %P
|
||||
; CHECK-NOT: = load
|
||||
ret void
|
||||
; CHECK: ret void
|
||||
}
|
Loading…
Reference in New Issue