Fix an issue with the IR sink pass found by inspection. (I'm not sure anyone is actually using this, but might as well fix it since I found the issue.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138965 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2011-09-01 21:21:24 +00:00
parent 89e0f4b5b0
commit 86b5db8c01
2 changed files with 22 additions and 7 deletions

View File

@ -153,9 +153,13 @@ bool Sinking::ProcessBlock(BasicBlock &BB) {
static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA,
SmallPtrSet<Instruction *, 8> &Stores) {
if (LoadInst *L = dyn_cast<LoadInst>(Inst)) {
if (L->isVolatile()) return false;
if (Inst->mayWriteToMemory()) {
Stores.insert(Inst);
return false;
}
if (LoadInst *L = dyn_cast<LoadInst>(Inst)) {
AliasAnalysis::Location Loc = AA->getLocation(L);
for (SmallPtrSet<Instruction *, 8>::iterator I = Stores.begin(),
E = Stores.end(); I != E; ++I)
@ -163,11 +167,6 @@ static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA,
return false;
}
if (Inst->mayWriteToMemory()) {
Stores.insert(Inst);
return false;
}
if (isa<TerminatorInst>(Inst) || isa<PHINode>(Inst))
return false;

View File

@ -20,3 +20,19 @@ true:
false:
ret i32 0
}
; But don't sink volatile loads...
; CHECK: @foo2
; CHECK: volatile load
; CHECK-NEXT: store i32
define i32 @foo2(i1 %z) {
%l = volatile load i32* @A
store i32 0, i32* @B
br i1 %z, label %true, label %false
true:
ret i32 %l
false:
ret i32 0
}