[llvm] r183239 - IndVarSimplify: check if loop invariant expansion can trap

David Majnemer david.majnemer at gmail.com
Tue Jun 4 10:51:58 PDT 2013


Author: majnemer
Date: Tue Jun  4 12:51:58 2013
New Revision: 183239

URL: http://llvm.org/viewvc/llvm-project?rev=183239&view=rev
Log:
IndVarSimplify: check if loop invariant expansion can trap

IndVarSimplify is willing to move divide instructions outside of their
loop bodies if they are invariant of the loop.  However, it may not be
safe to expand them if we do not know if they can trap.

Instead, check to see if it is not safe to expand the instruction and
skip the expansion.

This fixes PR16041.

Testcase by Rafael Ávila de Espíndola.

Added:
    llvm/trunk/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.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=183239&r1=183238&r2=183239&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Tue Jun  4 12:51:58 2013
@@ -532,7 +532,7 @@ void IndVarSimplify::RewriteLoopExitValu
         // and varies predictably *inside* the loop.  Evaluate the value it
         // contains when the loop exits, if possible.
         const SCEV *ExitValue = SE->getSCEVAtScope(Inst, L->getParentLoop());
-        if (!SE->isLoopInvariant(ExitValue, L))
+        if (!SE->isLoopInvariant(ExitValue, L) || !isSafeToExpand(ExitValue))
           continue;
 
         // Computing the value outside of the loop brings no benefit if :

Added: llvm/trunk/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll?rev=183239&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll (added)
+++ llvm/trunk/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll Tue Jun  4 12:51:58 2013
@@ -0,0 +1,32 @@
+; RUN: opt -indvars -S < %s | FileCheck %s
+
+ at b = common global i32 0, align 4
+
+define i32 @foo(i32 %x, i1 %y) {
+bb0:
+  br label %bb1
+
+bb1:
+  br i1 %y, label %bb14, label %bb8
+
+bb8:
+  %i = phi i64 [ %i.next, %bb8 ], [ 0, %bb1 ]
+  %i.next = add i64 %i, 1
+  %div = udiv i32 1, %x
+  %c = icmp eq i64 %i.next, 6
+  br i1 %c, label %bb11, label %bb8
+
+bb11:
+  br i1 %y, label %bb1, label %bb13
+
+bb13:
+  store i32 %div, i32* @b, align 4
+  br label %bb14
+
+bb14:
+  ret i32 0
+}
+
+; CHECK: @foo
+; CHECK: bb8:
+; CHECK: udiv





More information about the llvm-commits mailing list