mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Don't skip over instructions other than loads that might read memory
when trying to sink stores. llvm-svn: 52259
This commit is contained in:
parent
7f1fcc4339
commit
11d4c94933
@ -10417,18 +10417,19 @@ bool InstCombiner::SimplifyStoreAtEndOfBlock(StoreInst &SI) {
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
// If we find something that may be using the stored value, or if we run
|
||||
// out of instructions, we can't do the xform.
|
||||
if (isa<LoadInst>(BBI) || BBI->mayWriteToMemory() ||
|
||||
// If we find something that may be using or overwriting the stored
|
||||
// value, or if we run out of instructions, we can't do the xform.
|
||||
if (BBI->mayReadFromMemory() || BBI->mayWriteToMemory() ||
|
||||
BBI == OtherBB->begin())
|
||||
return false;
|
||||
}
|
||||
|
||||
// In order to eliminate the store in OtherBr, we have to
|
||||
// make sure nothing reads the stored value in StoreBB.
|
||||
// make sure nothing reads or overwrites the stored value in
|
||||
// StoreBB.
|
||||
for (BasicBlock::iterator I = StoreBB->begin(); &*I != &SI; ++I) {
|
||||
// FIXME: This should really be AA driven.
|
||||
if (isa<LoadInst>(I) || I->mayWriteToMemory())
|
||||
if (I->mayReadFromMemory() || I->mayWriteToMemory())
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
19
test/Transforms/InstCombine/2008-06-13-ReadOnlyCallStore.ll
Normal file
19
test/Transforms/InstCombine/2008-06-13-ReadOnlyCallStore.ll
Normal file
@ -0,0 +1,19 @@
|
||||
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {store i8} | count 2
|
||||
|
||||
define i32 @a(i8* %s) nounwind {
|
||||
entry:
|
||||
store i8 0, i8* %s, align 1 ; This store cannot be eliminated!
|
||||
%tmp3 = call i32 @strlen( i8* %s ) nounwind readonly
|
||||
%tmp5 = icmp ne i32 %tmp3, 0
|
||||
br i1 %tmp5, label %bb, label %bb8
|
||||
|
||||
bb: ; preds = %entry
|
||||
store i8 0, i8* %s, align 1
|
||||
br label %bb8
|
||||
|
||||
bb8:
|
||||
ret i32 %tmp3
|
||||
}
|
||||
|
||||
declare i32 @strlen(i8*) nounwind readonly
|
||||
|
Loading…
Reference in New Issue
Block a user