make memdep use the getModRefInfo method for stores instead of the
authorChris Lattner <sabre@nondot.org>
Mon, 25 May 2009 21:28:56 +0000 (21:28 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 25 May 2009 21:28:56 +0000 (21:28 +0000)
low-level alias() method, allowing it to reason more aggressively
about pointers into constant memory.  PR4189

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

lib/Analysis/MemoryDependenceAnalysis.cpp
test/Transforms/GVN/load-constant-mem.ll [new file with mode: 0644]

index 74c962147ceed0f75bbc68d322ba07328783a592..3b2102955f3378f5d3d0f45d10f7a86025fcbc64 100644 (file)
@@ -202,9 +202,17 @@ getPointerDependencyFrom(Value *MemPtr, uint64_t MemSize, bool isLoad,
     }
     
     if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
+      // If alias analysis can tell that this store is guaranteed to not modify
+      // the query pointer, ignore it.  Use getModRefInfo to handle cases where
+      // the query pointer points to constant memory etc.
+      if (AA->getModRefInfo(SI, MemPtr, MemSize) == AliasAnalysis::NoModRef)
+        continue;
+
+      // Ok, this store might clobber the query pointer.  Check to see if it is
+      // a must alias: in this case, we want to return this as a def.
       Value *Pointer = SI->getPointerOperand();
       uint64_t PointerSize = TD->getTypeStoreSize(SI->getOperand(0)->getType());
-
+      
       // If we found a pointer, check if it could be the same as our pointer.
       AliasAnalysis::AliasResult R =
         AA->alias(Pointer, PointerSize, MemPtr, MemSize);
diff --git a/test/Transforms/GVN/load-constant-mem.ll b/test/Transforms/GVN/load-constant-mem.ll
new file mode 100644 (file)
index 0000000..83b9d38
--- /dev/null
@@ -0,0 +1,13 @@
+; RUN: llvm-as < %s | opt -gvn -instcombine | llvm-dis | grep {ret i32 0}
+; PR4189
+@G = external constant [4 x i32]
+
+define i32 @test(i8* %p, i32 %i) nounwind {
+entry:
+       %P = getelementptr [4 x i32]* @G, i32 0, i32 %i
+       %A = load i32* %P
+       store i8 4, i8* %p
+       %B = load i32* %P
+       %C = sub i32 %A, %B
+       ret i32 %C
+}