1*9880d681SAndroid Build Coastguard Worker; RUN: llvm-as < %s | llvm-dis > %t1.ll 2*9880d681SAndroid Build Coastguard Worker; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll 3*9880d681SAndroid Build Coastguard Worker; RUN: diff %t1.ll %t2.ll 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare i32 @atoi(i8*) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i64 @fib(i64 %n) { 8*9880d681SAndroid Build Coastguard Worker icmp ult i64 %n, 2 ; <i1>:1 [#uses=1] 9*9880d681SAndroid Build Coastguard Worker br i1 %1, label %BaseCase, label %RecurseCase 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard WorkerBaseCase: ; preds = %0 12*9880d681SAndroid Build Coastguard Worker ret i64 1 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard WorkerRecurseCase: ; preds = %0 15*9880d681SAndroid Build Coastguard Worker %n2 = sub i64 %n, 2 ; <i64> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker %n1 = sub i64 %n, 1 ; <i64> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker %f2 = call i64 @fib( i64 %n2 ) ; <i64> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker %f1 = call i64 @fib( i64 %n1 ) ; <i64> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker %result = add i64 %f2, %f1 ; <i64> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker ret i64 %result 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i64 @realmain(i32 %argc, i8** %argv) { 24*9880d681SAndroid Build Coastguard Worker; <label>:0 25*9880d681SAndroid Build Coastguard Worker icmp eq i32 %argc, 2 ; <i1>:1 [#uses=1] 26*9880d681SAndroid Build Coastguard Worker br i1 %1, label %HasArg, label %Continue 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard WorkerHasArg: ; preds = %0 29*9880d681SAndroid Build Coastguard Worker %n1 = add i32 1, 1 ; <i32> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker br label %Continue 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard WorkerContinue: ; preds = %HasArg, %0 33*9880d681SAndroid Build Coastguard Worker %n = phi i32 [ %n1, %HasArg ], [ 1, %0 ] ; <i32> [#uses=1] 34*9880d681SAndroid Build Coastguard Worker %N = sext i32 %n to i64 ; <i64> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker %F = call i64 @fib( i64 %N ) ; <i64> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker ret i64 %F 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i64 @trampoline(i64 %n, i64 (i64)* %fibfunc) { 40*9880d681SAndroid Build Coastguard Worker %F = call i64 %fibfunc( i64 %n ) ; <i64> [#uses=1] 41*9880d681SAndroid Build Coastguard Worker ret i64 %F 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine i32 @main() { 45*9880d681SAndroid Build Coastguard Worker %Result = call i64 @trampoline( i64 10, i64 (i64)* @fib ) ; <i64> [#uses=1] 46*9880d681SAndroid Build Coastguard Worker %Result.upgrd.1 = trunc i64 %Result to i32 ; <i32> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker ret i32 %Result.upgrd.1 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50