summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2013-06-04 17:51:58 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2013-06-04 17:51:58 +0000
commit5a57dbef33ec2d336de2a2e9da4e477a4969fe57 (patch)
tree2acc702f179de66ff5f061b01148bff1a8ad6087 /test
parent35e7751af455f2cc559cdc2d3424b53706e09bb3 (diff)
downloadllvm-5a57dbef33ec2d336de2a2e9da4e477a4969fe57.tar.gz
llvm-5a57dbef33ec2d336de2a2e9da4e477a4969fe57.tar.bz2
llvm-5a57dbef33ec2d336de2a2e9da4e477a4969fe57.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183239 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll32
1 files changed, 32 insertions, 0 deletions
diff --git a/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll b/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll
new file mode 100644
index 0000000000..b2d2629eb3
--- /dev/null
+++ b/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll
@@ -0,0 +1,32 @@
+; RUN: opt -indvars -S < %s | FileCheck %s
+
+@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