diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2009-07-15 22:48:29 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2009-07-15 22:48:29 +0000 |
| commit | 662da55c5fc6447ae5205981b30f1869b6f80468 (patch) | |
| tree | d954942bee7eacab426d4625529a1ac9946718b0 /llvm | |
| parent | 5854e5b179080e9f237dc8b14a428c40a0226f7b (diff) | |
| download | bcm5719-llvm-662da55c5fc6447ae5205981b30f1869b6f80468.tar.gz bcm5719-llvm-662da55c5fc6447ae5205981b30f1869b6f80468.zip | |
Switch invars away from using isTrapping when it really shouldn't be
using it.
llvm-svn: 75852
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/Transforms/IndVarSimplify/sink-trapping.ll | 19 |
2 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index 1a6c6a13211..0ac58f1fea9 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -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). diff --git a/llvm/test/Transforms/IndVarSimplify/sink-trapping.ll b/llvm/test/Transforms/IndVarSimplify/sink-trapping.ll new file mode 100644 index 00000000000..5382c92e44a --- /dev/null +++ b/llvm/test/Transforms/IndVarSimplify/sink-trapping.ll @@ -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 |

