blob: 8a6f77384d7322e795bc004c3533c7887c37683e [file] [log] [blame]
Reid Spencerc0948362007-01-16 18:08:22 +00001; RUN: llvm-as %s -o - | llvm-dis > %t1.ll
2; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll
3; RUN: diff %t1.ll %t2.ll
4
5implementation
6
7declare i32 "atoi"(i8 *)
8
9define i63 "fib"(i63 %n)
10begin
11 icmp ult i63 %n, 2 ; {i1}:0
12 br i1 %0, label %BaseCase, label %RecurseCase
13
14BaseCase:
15 ret i63 1
16
17RecurseCase:
18 %n2 = sub i63 %n, 2
19 %n1 = sub i63 %n, 1
20 %f2 = call i63(i63) * %fib(i63 %n2)
21 %f1 = call i63(i63) * %fib(i63 %n1)
22 %result = add i63 %f2, %f1
23 ret i63 %result
24end
25
26define i63 "realmain"(i32 %argc, i8 ** %argv)
27begin
28 icmp eq i32 %argc, 2 ; {i1}:0
29 br i1 %0, label %HasArg, label %Continue
30HasArg:
31 ; %n1 = atoi(argv[1])
32 %n1 = add i32 1, 1
33 br label %Continue
34
35Continue:
36 %n = phi i32 [%n1, %HasArg], [1, %0]
37 %N = sext i32 %n to i63
38 %F = call i63(i63) *%fib(i63 %N)
39 ret i63 %F
40end
41
42define i63 "trampoline"(i63 %n, i63(i63)* %fibfunc)
43begin
44 %F = call i63(i63) *%fibfunc(i63 %n)
45 ret i63 %F
46end
47
48define i32 "main"()
49begin
50 %Result = call i63 %trampoline(i63 10, i63(i63) *%fib)
51 %Result = trunc i63 %Result to i32
52 ret i32 %Result
53end
54