blob: 67cff4e754f0a632c757b1b0ab83b9ca182e78d4 [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
Reid Spencere3ff5ad2007-01-26 08:25:06 +00007declare i32 @"atoi"(i8 *)
Reid Spencerc0948362007-01-16 18:08:22 +00008
Reid Spencere3ff5ad2007-01-26 08:25:06 +00009define i63 @"fib"(i63 %n)
Reid Spencerc0948362007-01-16 18:08:22 +000010begin
Reid Spencer2318ec62007-03-19 18:27:35 +000011 icmp ult i63 %n, 2 ; {i1}:1
12 br i1 %1, label %BaseCase, label %RecurseCase
Reid Spencerc0948362007-01-16 18:08:22 +000013
14BaseCase:
15 ret i63 1
16
17RecurseCase:
18 %n2 = sub i63 %n, 2
19 %n1 = sub i63 %n, 1
Reid Spencere3ff5ad2007-01-26 08:25:06 +000020 %f2 = call i63(i63) * @fib(i63 %n2)
21 %f1 = call i63(i63) * @fib(i63 %n1)
Reid Spencerc0948362007-01-16 18:08:22 +000022 %result = add i63 %f2, %f1
23 ret i63 %result
24end
25
Reid Spencere3ff5ad2007-01-26 08:25:06 +000026define i63 @"realmain"(i32 %argc, i8 ** %argv)
Reid Spencerc0948362007-01-16 18:08:22 +000027begin
Reid Spencer2318ec62007-03-19 18:27:35 +000028 icmp eq i32 %argc, 2 ; {i1}:1
29 br i1 %1, label %HasArg, label %Continue
Reid Spencerc0948362007-01-16 18:08:22 +000030HasArg:
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
Reid Spencere3ff5ad2007-01-26 08:25:06 +000038 %F = call i63(i63) *@fib(i63 %N)
Reid Spencerc0948362007-01-16 18:08:22 +000039 ret i63 %F
40end
41
Reid Spencere3ff5ad2007-01-26 08:25:06 +000042define i63 @"trampoline"(i63 %n, i63(i63)* %fibfunc)
Reid Spencerc0948362007-01-16 18:08:22 +000043begin
44 %F = call i63(i63) *%fibfunc(i63 %n)
45 ret i63 %F
46end
47
Reid Spencere3ff5ad2007-01-26 08:25:06 +000048define i32 @"main"()
Reid Spencerc0948362007-01-16 18:08:22 +000049begin
Reid Spencere3ff5ad2007-01-26 08:25:06 +000050 %Result = call i63 @trampoline(i63 10, i63(i63) *@fib)
Reid Spencer90850432007-01-30 16:16:01 +000051 %Result2 = trunc i63 %Result to i32
52 ret i32 %Result2
Reid Spencerc0948362007-01-16 18:08:22 +000053end