[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