Take advantage of TargetData when available; we know that the atomic intrinsics
authorNick Lewycky <nicholas@mxc.ca>
Thu, 15 Oct 2009 00:36:35 +0000 (00:36 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Thu, 15 Oct 2009 00:36:35 +0000 (00:36 +0000)
only dereference the element they point to directly with no pointer arithmetic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84159 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BasicAliasAnalysis.cpp

index 2c4efc4985b31a3617d5b4256522ec1d203694b7..144ba09a30a2d840dcf52cc8202f798fbd4ad7aa 100644 (file)
@@ -307,24 +307,29 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
         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;
+    if (TD) {
+      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: {
+          Value *Op1 = II->getOperand(1);
+          unsigned Op1Size = TD->getTypeStoreSize(Op1->getType());
+          if (alias(Op1, Op1Size, P, Size) == NoAlias)
+            return NoModRef;
+          break;
+        }
+        }
       }
     }
   }