Switch invars away from using isTrapping when it really shouldn't be

using it.

llvm-svn: 75852
This commit is contained in:
Eli Friedman 2009-07-15 22:48:29 +00:00
parent 5854e5b179
commit 662da55c5f
2 changed files with 26 additions and 1 deletions

View File

@ -544,7 +544,13 @@ void IndVarSimplify::SinkUnusedInvariants(Loop *L) {
// New instructions were inserted at the end of the preheader.
if (isa<PHINode>(I))
break;
if (I->isTrapping())
// Don't move instructions which might have side effects, since the side
// effects need to complete before instructions inside the loop. Also
// don't move instructions which might read memory, since the loop may
// modify memory. Note that it's okay if the instruction might have
// undefined behavior: LoopSimplify guarantees that the preheader
// dominates the exit block.
if (I->mayHaveSideEffects() || I->mayReadFromMemory())
continue;
// Determine if there is a use in or before the loop (direct or
// otherwise).

View File

@ -0,0 +1,19 @@
; RUN: llvm-as < %s | opt -indvars | llvm-dis | FileCheck %s --check-prefix=CHECK
declare i1 @b()
define i32 @a(i32 %x) nounwind {
for.body.preheader:
%y = sdiv i32 10, %x
br label %for.body
for.body:
%cmp = call i1 @b()
br i1 %cmp, label %for.body, label %for.end.loopexit
for.end.loopexit:
ret i32 %y
}
; CHECK: for.end.loopexit:
; CHECK: sdiv
; CHECK: ret