define {i64*,i64*} @e_fib_eqI_b_nfib(i64* %hp.0, i64** %globasp, i64* %n) align 8 prefix {i8*, i64} {i8* inttoptr (i64 0 to i8*), i64 1} { %astack = alloca i64*, i64 10 %asp.000 = getelementptr i64*, i64** %astack %bstack = alloca i64, i64 10 %bsp.000 = getelementptr i64, i64* %bstack, i64 9 %asp.001 = getelementptr i64*, i64** %asp.000, i64 1 store i64* %n, i64** %asp.001 %t.0 = bitcast {i64*,i64*}(i64**,i64*)* @_cycle_in_spine to i64* %asp.002 = call i64** @push_node(i64* %t.0, i64 1, i64** %asp.001) %t.1 = call i64* @peek_a(i64** %asp.002) %asp.003 = call i64** @pop_a1(i64** %asp.002) %globasp.0 = call i64** @_push_local_astack(i64** %asp.003, i64** %asp.000, i64** %globasp) %t.2 = call {i64*,i64} @ea1(i64* %hp.0, i64** %globasp.0, i64* %t.1) %hp.1 = extractvalue {i64*,i64} %t.2, 0 %t.2.0 = extractvalue {i64*,i64} %t.2, 1 %bsp.001 = call i64* @pushI(i64 %t.2.0, i64* %bsp.000) %asp.004 = call i64** @fillI_b(i64 0, i64 -0, i64* %bsp.001, i64** %asp.003) %bsp.002 = call i64* @pop_b1(i64* %bsp.001) %t.3 = call i64* @peek_a(i64** %asp.004) %asp.005 = call i64** @pop_a1(i64** %asp.004) %ret.0 = insertvalue {i64*,i64*} undef, i64* %hp.1, 0 %ret.1 = insertvalue {i64*,i64*} %ret.0, i64* %t.3, 1 ret {i64*,i64*} %ret.1 } define private {i64*,i64} @ea1(i64* %hp.0, i64** %globasp, i64* %n) { %astack = alloca i64*, i64 10 %asp.000 = getelementptr i64*, i64** %astack, i64 0 %bstack = alloca i64, i64 10 %bsp.000 = getelementptr i64, i64* %bstack, i64 9 %asp.001 = getelementptr i64*, i64** %asp.000, i64 1 store i64* %n, i64** %asp.001 %hp.1 = call i64* @jsr_eval(i64 -0, i64** %asp.001, i64** %asp.000, i64** %globasp, i64* %hp.0) %bsp.001 = call i64* @pushI_a(i64 -0, i64* %bsp.000, i64** %asp.001) %asp.002 = call i64** @pop_a1(i64** %asp.001) %t.0 = call i64 @peek_b(i64* %bsp.001) %bsp.002 = call i64* @pop_b1(i64* %bsp.001) %t.1 = tail call {i64*,i64} @s1(i64* %hp.1, i64** %globasp, i64 %t.0) %hp.2 = extractvalue {i64*,i64} %t.1, 0 %t.2 = extractvalue {i64*,i64} %t.1, 1 %ret.0 = insertvalue {i64*,i64} undef, i64* %hp.2, 0 %ret.1 = insertvalue {i64*,i64} %ret.0, i64 %t.2, 1 ret {i64*,i64} %ret.1 } define private {i64*,i64} @s1(i64* %hp.0, i64** %globasp, i64 %arg) #0 { %astack = alloca i64*, i64 10000 %asp.000 = getelementptr i64*, i64** %astack %bstack = alloca i64, i64 10000 %bsp.000 = getelementptr i64, i64* %bstack, i64 9999 %bsp.001 = call i64* @pushI(i64 %arg, i64* %bsp.000) %bsp.002 = call i64* @eqI_b(i64 0, i64 0, i64* %bsp.001) %t.0 = call i64 @peek_b(i64* %bsp.002) %bsp.003 = call i64* @pop_b1(i64* %bsp.002) %t.1 = trunc i64 %t.0 to i1 br i1 %t.1, label %case.1, label %l.0 l.0: %bsp.004 = call i64* @eqI_b(i64 1, i64 0, i64* %bsp.003) %t.2 = call i64 @peek_b(i64* %bsp.004) %bsp.005 = call i64* @pop_b1(i64* %bsp.004) %t.3 = trunc i64 %t.2 to i1 br i1 %t.3, label %case.2, label %case.3 case.1: %bsp.100 = call i64* @pop_b1(i64* %bsp.003) %bsp.101 = call i64* @pushI(i64 1, i64* %bsp.100) %r.1 = call i64 @peek_b(i64* %bsp.101) %bsp.102 = call i64* @pop_b1(i64* %bsp.101) %ret.0 = insertvalue {i64*,i64} undef, i64* %hp.0, 0 %ret.1 = insertvalue {i64*,i64} %ret.0, i64 %r.1, 1 ret {i64*,i64} %ret.1 case.2: %bsp.200 = call i64* @pop_b1(i64* %bsp.005) %bsp.201 = call i64* @pushI(i64 1, i64* %bsp.200) %r.2 = call i64 @peek_b(i64* %bsp.201) %bsp.202 = call i64* @pop_b1(i64* %bsp.201) %ret.2 = insertvalue {i64*,i64} undef, i64* %hp.0, 0 %ret.3 = insertvalue {i64*,i64} %ret.2, i64 %r.2, 1 ret {i64*,i64} %ret.3 case.3: %bsp.300 = call i64* @pushI(i64 1, i64* %bsp.005) %bsp.301 = call i64* @push_b(i64 1, i64* %bsp.300) %bsp.302 = call i64* @subI(i64* %bsp.301) %arg.0 = call i64 @peek_b(i64* %bsp.302) %bsp.302.0 = call i64* @pop_b1(i64* %bsp.302) %t.4 = call {i64*,i64} @s1(i64* %hp.0, i64** %globasp, i64 %arg.0) %hp.1 = extractvalue {i64*,i64} %t.4, 0 %t.5 = extractvalue {i64*,i64} %t.4, 1 %bsp.303 = call i64* @pushI(i64 %t.5, i64* %bsp.302.0) %bsp.304 = call i64* @pushI(i64 2, i64* %bsp.303) %bsp.305 = call i64* @push_b(i64 2, i64* %bsp.304) %bsp.306 = call i64* @subI(i64* %bsp.305) %arg.1 = call i64 @peek_b(i64* %bsp.306) %bsp.306.0 = call i64* @pop_b1(i64* %bsp.306) %t.6 = call {i64*,i64} @s1(i64* %hp.1, i64** %globasp, i64 %arg.1) %hp.2 = extractvalue {i64*,i64} %t.6, 0 %t.7 = extractvalue {i64*,i64} %t.6, 1 %bsp.307 = call i64* @pushI(i64 %t.7, i64* %bsp.306.0) %bsp.308 = call i64* @update_b(i64 1, i64 2, i64* %bsp.307) %bsp.309 = call i64* @updatepop_b01(i64* %bsp.308) %bsp.310 = call i64* @addI(i64* %bsp.309) %r.3 = call i64 @peek_b(i64* %bsp.310) %bsp.311 = call i64* @pop_b1(i64* %bsp.310) %ret.4 = insertvalue {i64*,i64} undef, i64* %hp.2, 0 %ret.5 = insertvalue {i64*,i64} %ret.4, i64 %r.3, 1 ret {i64*,i64} %ret.5 } define i64 @main() { %hp.0 = call i64* @_alloc_heap(i64 10000) %astack = call i64** @_alloc_a_stack(i64 10000) %n.0 = getelementptr i64, i64* %hp.0 %INT.0 = ptrtoint {i64, i64, i64*, i64, i8, i8, i8}* @INT to i64 %INT.1 = add i64 %INT.0, 2 store i64 %INT.1, i64* %n.0 %n.0.0 = getelementptr i64, i64* %n.0, i64 1 store i64 43, i64* %n.0.0 %hp.1 = getelementptr i64, i64* %hp.0, i64 2 %n.1 = getelementptr i64, i64* %hp.1 store i64 ptrtoint ({i64*,i64*}(i64*,i64**,i64*)* @e_fib_eqI_b_nfib to i64), i64* %n.1 %t.0 = ptrtoint i64* %n.0 to i64 %n.1.0 = getelementptr i64, i64* %n.1, i64 1 store i64 %t.0, i64* %n.1.0 %hp.2 = getelementptr i64, i64* %hp.0, i64 3 %t.1 = call {i64*,i64*} @e_fib_eqI_b_nfib(i64* %hp.2, i64** %astack, i64* %n.1) %hp.3 = extractvalue {i64*,i64*} %t.1, 0 %n.2 = extractvalue {i64*,i64*} %t.1, 1 %n.3 = getelementptr i64, i64* %n.2, i64 1 %r = load i64, i64* %n.3 call i64 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @printf_d, i64 0, i64 0), i64 %r) call i64 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @printf_c, i64 0, i64 0), i64 10) ret i64 0 }