make memdep use the getModRefInfo method for stores instead of the

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
This commit is contained in:
Chris Lattner 2009-05-25 21:28:56 +00:00
parent d67a1666ec
commit ab9cf1282b
2 changed files with 22 additions and 1 deletions

View File

@ -202,6 +202,14 @@ 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());

View File

@ -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
}