summaryrefslogtreecommitdiff
path: root/test/Transforms/TailCallElim
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2009-11-07 21:10:15 +0000
committerNick Lewycky <nicholas@mxc.ca>2009-11-07 21:10:15 +0000
commitf80fcd00b3590626a6110fe5fbe9b5fd2a8be1ae (patch)
tree9090f3aa1b8170993671f2479436182b6ee9fc09 /test/Transforms/TailCallElim
parentbf992817f28bdab09fe1d1349561efb0c89fb0dd (diff)
downloadllvm-f80fcd00b3590626a6110fe5fbe9b5fd2a8be1ae.tar.gz
llvm-f80fcd00b3590626a6110fe5fbe9b5fd2a8be1ae.tar.bz2
llvm-f80fcd00b3590626a6110fe5fbe9b5fd2a8be1ae.tar.xz
Improve tail call elimination to handle the switch statement.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86403 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/TailCallElim')
-rw-r--r--test/Transforms/TailCallElim/switch.ll34
1 files changed, 34 insertions, 0 deletions
diff --git a/test/Transforms/TailCallElim/switch.ll b/test/Transforms/TailCallElim/switch.ll
new file mode 100644
index 0000000000..33884318b0
--- /dev/null
+++ b/test/Transforms/TailCallElim/switch.ll
@@ -0,0 +1,34 @@
+; RUN: opt %s -tailcallelim -S | FileCheck %s
+
+define i64 @fib(i64 %n) nounwind readnone {
+; CHECK: @fib
+entry:
+; CHECK: tailrecurse:
+; CHECK: %accumulator.tr = phi i64 [ %n, %entry ], [ %3, %bb1 ]
+; CHECK: %n.tr = phi i64 [ %n, %entry ], [ %2, %bb1 ]
+ switch i64 %n, label %bb1 [
+; CHECK: switch i64 %n.tr, label %bb1 [
+ i64 0, label %bb2
+ i64 1, label %bb2
+ ]
+
+bb1:
+; CHECK: bb1:
+ %0 = add i64 %n, -1
+; CHECK: %0 = add i64 %n.tr, -1
+ %1 = tail call i64 @fib(i64 %0) nounwind
+; CHECK: %1 = tail call i64 @fib(i64 %0)
+ %2 = add i64 %n, -2
+; CHECK: %2 = add i64 %n.tr, -2
+ %3 = tail call i64 @fib(i64 %2) nounwind
+; CHECK-NOT: tail call i64 @fib
+ %4 = add nsw i64 %3, %1
+; CHECK: add nsw i64 %accumulator.tr, %1
+ ret i64 %4
+; CHECK: br label %tailrecurse
+
+bb2:
+; CHECK: bb2:
+ ret i64 %n
+; CHECK: ret i64 %accumulator.tr
+}