blob: 33884318b0c81fe66283c77e1a58ef4ae2e3c8cc [file] [log] [blame]
Nick Lewyckyded7c4a2009-11-07 21:10:15 +00001; RUN: opt %s -tailcallelim -S | FileCheck %s
2
3define i64 @fib(i64 %n) nounwind readnone {
4; CHECK: @fib
5entry:
6; CHECK: tailrecurse:
7; CHECK: %accumulator.tr = phi i64 [ %n, %entry ], [ %3, %bb1 ]
8; CHECK: %n.tr = phi i64 [ %n, %entry ], [ %2, %bb1 ]
9 switch i64 %n, label %bb1 [
10; CHECK: switch i64 %n.tr, label %bb1 [
11 i64 0, label %bb2
12 i64 1, label %bb2
13 ]
14
15bb1:
16; CHECK: bb1:
17 %0 = add i64 %n, -1
18; CHECK: %0 = add i64 %n.tr, -1
19 %1 = tail call i64 @fib(i64 %0) nounwind
20; CHECK: %1 = tail call i64 @fib(i64 %0)
21 %2 = add i64 %n, -2
22; CHECK: %2 = add i64 %n.tr, -2
23 %3 = tail call i64 @fib(i64 %2) nounwind
24; CHECK-NOT: tail call i64 @fib
25 %4 = add nsw i64 %3, %1
26; CHECK: add nsw i64 %accumulator.tr, %1
27 ret i64 %4
28; CHECK: br label %tailrecurse
29
30bb2:
31; CHECK: bb2:
32 ret i64 %n
33; CHECK: ret i64 %accumulator.tr
34}