mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-15 07:33:18 +00:00
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:
parent
d67a1666ec
commit
ab9cf1282b
@ -202,9 +202,17 @@ getPointerDependencyFrom(Value *MemPtr, uint64_t MemSize, bool isLoad,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
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();
|
Value *Pointer = SI->getPointerOperand();
|
||||||
uint64_t PointerSize = TD->getTypeStoreSize(SI->getOperand(0)->getType());
|
uint64_t PointerSize = TD->getTypeStoreSize(SI->getOperand(0)->getType());
|
||||||
|
|
||||||
// If we found a pointer, check if it could be the same as our pointer.
|
// If we found a pointer, check if it could be the same as our pointer.
|
||||||
AliasAnalysis::AliasResult R =
|
AliasAnalysis::AliasResult R =
|
||||||
AA->alias(Pointer, PointerSize, MemPtr, MemSize);
|
AA->alias(Pointer, PointerSize, MemPtr, MemSize);
|
||||||
|
13
test/Transforms/GVN/load-constant-mem.ll
Normal file
13
test/Transforms/GVN/load-constant-mem.ll
Normal 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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user