aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/AliasAnalysis.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-02-04 05:16:46 +0000
committerOwen Anderson <resistor@mac.com>2009-02-04 05:16:46 +0000
commitfe9388ccb4d2449e8e6a62053479a0ba74ae0b2d (patch)
tree8a3d31f8efcb67c2e815938be17abd03952a7149 /lib/Analysis/AliasAnalysis.cpp
parent39355f9fea790c5a1b12ef0fdcfeac3f533232ea (diff)
Finish making AliasAnalysis aware of the fact that most atomic intrinsics only dereference their arguments, and enhance
BasicAA to make use of this fact when computing ModRef info. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63718 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/AliasAnalysis.cpp')
-rw-r--r--lib/Analysis/AliasAnalysis.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp
index 2571492118..3e46fccc58 100644
--- a/lib/Analysis/AliasAnalysis.cpp
+++ b/lib/Analysis/AliasAnalysis.cpp
@@ -150,6 +150,27 @@ AliasAnalysis::getModRefBehavior(CallSite CS,
AliasAnalysis::ModRefBehavior
AliasAnalysis::getModRefBehavior(Function *F,
std::vector<PointerAccessInfo> *Info) {
+ if (F->isIntrinsic()) {
+ switch (F->getIntrinsicID()) {
+ case Intrinsic::atomic_cmp_swap:
+ case Intrinsic::atomic_load_add:
+ case Intrinsic::atomic_load_and:
+ case Intrinsic::atomic_load_max:
+ case Intrinsic::atomic_load_min:
+ case Intrinsic::atomic_load_nand:
+ case Intrinsic::atomic_load_or:
+ case Intrinsic::atomic_load_sub:
+ case Intrinsic::atomic_load_umax:
+ case Intrinsic::atomic_load_umin:
+ case Intrinsic::atomic_load_xor:
+ case Intrinsic::atomic_swap:
+ // CAS and related intrinsics only access their arguments.
+ return AliasAnalysis::AccessesArguments;
+ default:
+ break;
+ }
+ }
+
if (F->doesNotAccessMemory())
// Can't do better than this.
return DoesNotAccessMemory;