[llvm-commits] [llvm] r75852 - in /llvm/trunk: lib/Transforms/Scalar/IndVarSimplify.cpp test/Transforms/IndVarSimplify/sink-trapping.ll
Eli Friedman
eli.friedman at gmail.com
Wed Jul 15 15:48:52 PDT 2009
Author: efriedma
Date: Wed Jul 15 17:48:29 2009
New Revision: 75852
URL: http://llvm.org/viewvc/llvm-project?rev=75852&view=rev
Log:
Switch invars away from using isTrapping when it really shouldn't be
using it.
Added:
llvm/trunk/test/Transforms/IndVarSimplify/sink-trapping.ll
Modified:
llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=75852&r1=75851&r2=75852&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Wed Jul 15 17:48:29 2009
@@ -544,7 +544,13 @@
// 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).
Added: llvm/trunk/test/Transforms/IndVarSimplify/sink-trapping.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/sink-trapping.ll?rev=75852&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/sink-trapping.ll (added)
+++ llvm/trunk/test/Transforms/IndVarSimplify/sink-trapping.ll Wed Jul 15 17:48:29 2009
@@ -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
More information about the llvm-commits
mailing list