Teach AliasAnalysis that a bunch of the atomic intrinsics only dereference their...
authorOwen Anderson <resistor@mac.com>
Tue, 3 Feb 2009 06:27:22 +0000 (06:27 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 3 Feb 2009 06:27:22 +0000 (06:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63616 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/AliasAnalysis.cpp

index d5de2fe616acbc319abc18cbf5e96b40b3fbc99f..2571492118b42356fa8cecc80b1afb2748704a15 100644 (file)
@@ -28,6 +28,7 @@
 #include "llvm/Pass.h"
 #include "llvm/BasicBlock.h"
 #include "llvm/Function.h"
+#include "llvm/IntrinsicInst.h"
 #include "llvm/Instructions.h"
 #include "llvm/Type.h"
 #include "llvm/Target/TargetData.h"
@@ -114,6 +115,27 @@ AliasAnalysis::getModRefInfo(StoreInst *S, Value *P, unsigned Size) {
 AliasAnalysis::ModRefBehavior
 AliasAnalysis::getModRefBehavior(CallSite CS,
                                  std::vector<PointerAccessInfo> *Info) {
+  if (IntrinsicInst* II = dyn_cast<IntrinsicInst>(CS.getInstruction())) {
+    switch (II->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 (CS.doesNotAccessMemory())
     // Can't do better than this.
     return DoesNotAccessMemory;