mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
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
ab1dbddc83
commit
72f185f281
@ -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.
|
||||
|
16
test/Analysis/BasicAA/2009-10-13-AtomicModRef.ll
Normal file
16
test/Analysis/BasicAA/2009-10-13-AtomicModRef.ll
Normal file
@ -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
Block a user