diff options
-rw-r--r-- | Makefile | 19 | ||||
-rw-r--r-- | fib_eqI_b.ll | 107 | ||||
-rw-r--r-- | nfib_nsa.icl | 23 | ||||
-rw-r--r-- | nfib_nsa.ll | 211 | ||||
-rw-r--r-- | rts.ll | 103 |
5 files changed, 276 insertions, 187 deletions
@@ -5,26 +5,31 @@ ASM:=$(addsuffix .s,$(BIN)) BC:=$(addsuffix .bc,$(BIN)) DEPS:=rts.ll +OPT:=opt-11 +AS:=llvm-as-11 +LLC:=~/projects/llvm-project/build/bin/llc +CLANG:=clang-11 + all: $(BIN) $(BIN): %: %.o - clang-11 $^ -o $@ + $(CLANG) $^ -o $@ $(OBJ): %.o: %.bc - llc-11 -filetype=obj $^ -o $@ + $(LLC) -relocation-model=static -filetype=obj $^ -o $@ $(ASM): %.s: %.bc - llc-11 $^ -o $@ + $(LLC) -relocation-model=static $^ -o $@ $(BC): %.bc: %.opt.ll - llvm-as-11 $^ -o $@ + $(AS) $^ -o $@ $(OPTLL): %.opt.ll: $(DEPS) %.ll cat $^ \ - | opt-11 -S -always-inline \ - | opt-11 -S -O3 \ + | $(OPT) -S -always-inline \ + | $(OPT) -S -O3 \ | sed 's/noinline nounwind optnone/nounwind/' \ - | opt-11 -S -O3 \ + | $(OPT) -S -O3 \ -o $@ clean: diff --git a/fib_eqI_b.ll b/fib_eqI_b.ll index a6a684b..fbc1811 100644 --- a/fib_eqI_b.ll +++ b/fib_eqI_b.ll @@ -1,4 +1,4 @@ -define {i64*,i64**,i64*} @e_fib_eqI_b_nfib(i64* %hp.0, i64** %globasp.0, i64* %n) align 8 +define cc101 {%Hp,i64**,i64*} @e_fib_eqI_b_nfib(%Hp %hp.0, i64** %globasp.0, 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 @@ -14,10 +14,10 @@ define {i64*,i64**,i64*} @e_fib_eqI_b_nfib(i64* %hp.0, i64** %globasp.0, i64* %n %t.1 = call i64* @peek_a(i64** %asp.002) %asp.003 = call i64** @pop_a1(i64** %asp.002) %globasp.1 = call i64** @_push_local_astack(i64** %asp.003, i64** %asp.000, i64** %globasp.0) - %t.2 = call {i64*,i64**,i64} @ea1(i64* %hp.0, i64** %globasp.1, i64* %t.1) - %hp.1 = extractvalue {i64*,i64**,i64} %t.2, 0 - %globasp.2 = extractvalue {i64*,i64**,i64} %t.2, 1 - %t.2.0 = extractvalue {i64*,i64**,i64} %t.2, 2 + %t.2 = call cc101 {%Hp,i64**,i64} @ea1(%Hp %hp.0, i64** %globasp.1, i64* %t.1) + %hp.1 = extractvalue {%Hp,i64**,i64} %t.2, 0 + %globasp.2 = extractvalue {%Hp,i64**,i64} %t.2, 1 + %t.2.0 = extractvalue {%Hp,i64**,i64} %t.2, 2 %globasp.3 = call i64** @_pop_global_astack(i64** %asp.003, i64** %asp.000, i64** %globasp.2) %bsp.001 = call i64* @pushI(i64 %t.2.0, i64* %bsp.000) @@ -27,13 +27,13 @@ define {i64*,i64**,i64*} @e_fib_eqI_b_nfib(i64* %hp.0, i64** %globasp.0, i64* %n %t.3 = call i64* @peek_a(i64** %asp.004) %asp.005 = call i64** @pop_a1(i64** %asp.004) - %ret.0 = insertvalue {i64*,i64**,i64*} undef, i64* %hp.1, 0 - %ret.1 = insertvalue {i64*,i64**,i64*} %ret.0, i64** %globasp.3, 1 - %ret.2 = insertvalue {i64*,i64**,i64*} %ret.1, i64* %t.3, 2 - ret {i64*,i64**,i64*} %ret.2 + %ret.0 = insertvalue {%Hp,i64**,i64*} undef, %Hp %hp.1, 0 + %ret.1 = insertvalue {%Hp,i64**,i64*} %ret.0, i64** %globasp.3, 1 + %ret.2 = insertvalue {%Hp,i64**,i64*} %ret.1, i64* %t.3, 2 + ret {%Hp,i64**,i64*} %ret.2 } -define private {i64*,i64**,i64} @ea1(i64* %hp.0, i64** %globasp.0, i64* %n) { +define private cc101 {%Hp,i64**,i64} @ea1(%Hp %hp.0, i64** %globasp.0, i64* %n) { %astack = alloca i64*, i64 10 %asp.000 = getelementptr i64*, i64** %astack, i64 0 %bstack = alloca i64, i64 10 @@ -42,26 +42,26 @@ define private {i64*,i64**,i64} @ea1(i64* %hp.0, i64** %globasp.0, i64* %n) { %asp.001 = getelementptr i64*, i64** %asp.000, i64 1 store i64* %n, i64** %asp.001 - %j.0 = call {i64*,i64**} @jsr_eval(i64 -0, i64** %asp.001, i64** %asp.000, i64** %globasp.0, i64* %hp.0) - %hp.1 = extractvalue {i64*,i64**} %j.0, 0 - %globasp.1 = extractvalue {i64*,i64**} %j.0, 1 + %j.0 = call {%Hp,i64**} @jsr_eval(i64 -0, i64** %asp.001, i64** %asp.000, i64** %globasp.0, %Hp %hp.0) + %hp.1 = extractvalue {%Hp,i64**} %j.0, 0 + %globasp.1 = extractvalue {%Hp,i64**} %j.0, 1 %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**,i64} @s1(i64* %hp.1, i64** %globasp.1, i64 %t.0) - %hp.2 = extractvalue {i64*,i64**,i64} %t.1, 0 - %globasp.2 = extractvalue {i64*,i64**,i64} %t.1, 1 - %t.2 = extractvalue {i64*,i64**,i64} %t.1, 2 - - %ret.0 = insertvalue {i64*,i64**,i64} undef, i64* %hp.2, 0 - %ret.1 = insertvalue {i64*,i64**,i64} %ret.0, i64** %globasp.2, 1 - %ret.2 = insertvalue {i64*,i64**,i64} %ret.1, i64 %t.2, 2 - ret {i64*,i64**,i64} %ret.2 + %t.1 = tail call cc101 {%Hp,i64**,i64} @s1(%Hp %hp.1, i64** %globasp.1, i64 %t.0) + %hp.2 = extractvalue {%Hp,i64**,i64} %t.1, 0 + %globasp.2 = extractvalue {%Hp,i64**,i64} %t.1, 1 + %t.2 = extractvalue {%Hp,i64**,i64} %t.1, 2 + + %ret.0 = insertvalue {%Hp,i64**,i64} undef, %Hp %hp.2, 0 + %ret.1 = insertvalue {%Hp,i64**,i64} %ret.0, i64** %globasp.2, 1 + %ret.2 = insertvalue {%Hp,i64**,i64} %ret.1, i64 %t.2, 2 + ret {%Hp,i64**,i64} %ret.2 } -define private {i64*,i64**,i64} @s1(i64* %hp.0, i64** %globasp.0, i64 %arg) #0 { +define private cc101 {%Hp,i64**,i64} @s1(%Hp %hp.0, i64** %globasp.0, i64 %arg) #0 { %astack = alloca i64*, i64 10000 %asp.000 = getelementptr i64*, i64** %astack %bstack = alloca i64, i64 10000 @@ -89,10 +89,10 @@ case.1: %r.1 = call i64 @peek_b(i64* %bsp.101) %bsp.102 = call i64* @pop_b1(i64* %bsp.101) - %ret.0 = insertvalue {i64*,i64**,i64} undef, i64* %hp.0, 0 - %ret.1 = insertvalue {i64*,i64**,i64} %ret.0, i64** %globasp.0, 1 - %ret.2 = insertvalue {i64*,i64**,i64} %ret.1, i64 %r.1, 2 - ret {i64*,i64**,i64} %ret.2 + %ret.0 = insertvalue {%Hp,i64**,i64} undef, %Hp %hp.0, 0 + %ret.1 = insertvalue {%Hp,i64**,i64} %ret.0, i64** %globasp.0, 1 + %ret.2 = insertvalue {%Hp,i64**,i64} %ret.1, i64 %r.1, 2 + ret {%Hp,i64**,i64} %ret.2 case.2: %bsp.200 = call i64* @pop_b1(i64* %bsp.005) @@ -101,10 +101,10 @@ case.2: %r.2 = call i64 @peek_b(i64* %bsp.201) %bsp.202 = call i64* @pop_b1(i64* %bsp.201) - %ret.3 = insertvalue {i64*,i64**,i64} undef, i64* %hp.0, 0 - %ret.4 = insertvalue {i64*,i64**,i64} %ret.3, i64** %globasp.0, 1 - %ret.5 = insertvalue {i64*,i64**,i64} %ret.4, i64 %r.2, 2 - ret {i64*,i64**,i64} %ret.5 + %ret.3 = insertvalue {%Hp,i64**,i64} undef, %Hp %hp.0, 0 + %ret.4 = insertvalue {%Hp,i64**,i64} %ret.3, i64** %globasp.0, 1 + %ret.5 = insertvalue {%Hp,i64**,i64} %ret.4, i64 %r.2, 2 + ret {%Hp,i64**,i64} %ret.5 case.3: %bsp.300 = call i64* @pushI(i64 1, i64* %bsp.005) @@ -113,10 +113,10 @@ case.3: %arg.0 = call i64 @peek_b(i64* %bsp.302) %bsp.302.0 = call i64* @pop_b1(i64* %bsp.302) - %t.4 = call {i64*,i64**,i64} @s1(i64* %hp.0, i64** %globasp.0, i64 %arg.0) - %hp.1 = extractvalue {i64*,i64**,i64} %t.4, 0 - %globasp.1 = extractvalue {i64*,i64**,i64} %t.4, 1 - %t.5 = extractvalue {i64*,i64**,i64} %t.4, 2 + %t.4 = call cc101 {%Hp,i64**,i64} @s1(%Hp %hp.0, i64** %globasp.0, i64 %arg.0) + %hp.1 = extractvalue {%Hp,i64**,i64} %t.4, 0 + %globasp.1 = extractvalue {%Hp,i64**,i64} %t.4, 1 + %t.5 = extractvalue {%Hp,i64**,i64} %t.4, 2 %bsp.303 = call i64* @pushI(i64 %t.5, i64* %bsp.302.0) %bsp.304 = call i64* @pushI(i64 2, i64* %bsp.303) @@ -125,10 +125,10 @@ case.3: %arg.1 = call i64 @peek_b(i64* %bsp.306) %bsp.306.0 = call i64* @pop_b1(i64* %bsp.306) - %t.6 = call {i64*,i64**,i64} @s1(i64* %hp.1, i64** %globasp.1, i64 %arg.1) - %hp.2 = extractvalue {i64*,i64**,i64} %t.6, 0 - %globasp.2 = extractvalue {i64*,i64**,i64} %t.6, 1 - %t.7 = extractvalue {i64*,i64**,i64} %t.6, 2 + %t.6 = call cc101 {%Hp,i64**,i64} @s1(%Hp %hp.1, i64** %globasp.1, i64 %arg.1) + %hp.2 = extractvalue {%Hp,i64**,i64} %t.6, 0 + %globasp.2 = extractvalue {%Hp,i64**,i64} %t.6, 1 + %t.7 = extractvalue {%Hp,i64**,i64} %t.6, 2 %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) @@ -138,14 +138,18 @@ case.3: %r.3 = call i64 @peek_b(i64* %bsp.310) %bsp.311 = call i64* @pop_b1(i64* %bsp.310) - %ret.6 = insertvalue {i64*,i64**,i64} undef, i64* %hp.2, 0 - %ret.7 = insertvalue {i64*,i64**,i64} %ret.6, i64** %globasp.2, 1 - %ret.8 = insertvalue {i64*,i64**,i64} %ret.7, i64 %r.3, 2 - ret {i64*,i64**,i64} %ret.8 + %ret.6 = insertvalue {%Hp,i64**,i64} undef, %Hp %hp.2, 0 + %ret.7 = insertvalue {%Hp,i64**,i64} %ret.6, i64** %globasp.2, 1 + %ret.8 = insertvalue {%Hp,i64**,i64} %ret.7, i64 %r.3, 2 + ret {%Hp,i64**,i64} %ret.8 } define i64 @main() { - %hp.0 = call i64* @_alloc_heap(i64 10000) + %hp_free.0 = add i64 10000, 0 + %hp.0 = call i64* @_alloc_heap(i64 %hp_free.0) + %hp_s.0 = insertvalue %Hp undef, i64* %hp.0, 0 + %hp_s.1 = insertvalue %Hp %hp_s.0, i64 %hp_free.0, 1 + %asp.0 = call i64** @_alloc_a_stack(i64 10000) %n.0 = getelementptr i64, i64* %hp.0 @@ -155,18 +159,23 @@ define i64 @main() { %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 + %hp_free.1 = sub i64 %hp_free.0, 2 %n.1 = getelementptr i64, i64* %hp.1 - store i64 ptrtoint ({i64*,i64**,i64*}(i64*,i64**,i64*)* @e_fib_eqI_b_nfib to i64), i64* %n.1 + store i64 ptrtoint ({%Hp,i64**,i64*}(%Hp,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 + %hp_free.2 = sub i64 %hp_free.1, 3 + + %hp_s.2 = insertvalue %Hp %hp_s.1, i64* %hp.2, 0 + %hp_s.3 = insertvalue %Hp %hp_s.2, i64 %hp_free.2, 1 - %t.1 = call {i64*,i64**,i64*} @e_fib_eqI_b_nfib(i64* %hp.2, i64** %asp.0, i64* %n.1) - %hp.3 = extractvalue {i64*,i64**,i64*} %t.1, 0 - %asp.1 = extractvalue {i64*,i64**,i64*} %t.1, 1 - %n.2 = extractvalue {i64*,i64**,i64*} %t.1, 2 + %t.1 = call cc101 {%Hp,i64**,i64*} @e_fib_eqI_b_nfib(%Hp %hp_s.3, i64** %asp.0, i64* %n.1) + %hp_s.4 = extractvalue {%Hp,i64**,i64*} %t.1, 0 + %asp.1 = extractvalue {%Hp,i64**,i64*} %t.1, 1 + %n.2 = extractvalue {%Hp,i64**,i64*} %t.1, 2 %n.3 = getelementptr i64, i64* %n.2, i64 1 %r = load i64, i64* %n.3 diff --git a/nfib_nsa.icl b/nfib_nsa.icl index 5764e8f..8a681ca 100644 --- a/nfib_nsa.icl +++ b/nfib_nsa.icl @@ -23,4 +23,25 @@ nfib n = 1 = nfib (n-2) + nfib (n-1) + 1 -Start = nfib 34 +Start = + [ nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + , nfib 34 + ] diff --git a/nfib_nsa.ll b/nfib_nsa.ll index 62da012..500f4b3 100644 --- a/nfib_nsa.ll +++ b/nfib_nsa.ll @@ -1,6 +1,6 @@ -define {i64*,i64**,i64*} @n5( - i64* align 8 nocapture nofree nonnull %hp.0, - i64** nocapture nofree nonnull %globasp.0, +define cc101 {%Hp,i64**,i64*} @n5( + %Hp %hp.0, + i64** align 8 nocapture nofree nonnull %globasp.0, i64* align 8 nocapture nofree dereferenceable(3) %n) nofree willreturn nosync nounwind argmemonly align 8 prefix {i8*, i64} {i8* inttoptr (i64 0 to i8*), i64 0} { @@ -15,10 +15,10 @@ define {i64*,i64**,i64*} @n5( %t.0 = bitcast {i64*,i64**,i64*}(i64*,i64**)* @_cycle_in_spine to i64* %asp.002 = call i64** @push_node(i64* %t.0, i64 0, i64** %asp.001) - %t.1 = call {i64*,i64**,i64} @ea5(i64* %hp.0, i64** %globasp.0) - %hp.1 = extractvalue {i64*,i64**,i64} %t.1, 0 - %globasp.1 = extractvalue {i64*,i64**,i64} %t.1, 1 - %t.2 = extractvalue {i64*,i64**,i64} %t.1, 2 + %t.1 = call cc101 {%Hp,i64**,i64} @ea5(%Hp %hp.0, i64** %globasp.0) + %hp.1 = extractvalue {%Hp,i64**,i64} %t.1, 0 + %globasp.1 = extractvalue {%Hp,i64**,i64} %t.1, 1 + %t.2 = extractvalue {%Hp,i64**,i64} %t.1, 2 %bsp.001 = call i64* @pushI(i64 %t.2, i64* %bsp.000) %asp.003 = call i64** @fillI_b(i64 0, i64 -0, i64* %bsp.001, i64** %asp.002) @@ -27,22 +27,22 @@ define {i64*,i64**,i64*} @n5( %t.3 = call i64* @peek_a(i64** %asp.003) %asp.004 = call i64** @pop_a1(i64** %asp.003) - %ret.0 = insertvalue {i64*,i64**,i64*} undef, i64* %hp.1, 0 - %ret.1 = insertvalue {i64*,i64**,i64*} %ret.0, i64** %globasp.1, 1 - %ret.2 = insertvalue {i64*,i64**,i64*} %ret.1, i64* %t.3, 2 - ret {i64*,i64**,i64*} %ret.2 + %ret.0 = insertvalue {%Hp,i64**,i64*} undef, %Hp %hp.1, 0 + %ret.1 = insertvalue {%Hp,i64**,i64*} %ret.0, i64** %globasp.1, 1 + %ret.2 = insertvalue {%Hp,i64**,i64*} %ret.1, i64* %t.3, 2 + ret {%Hp,i64**,i64*} %ret.2 } -define private {i64*,i64**,i64} @ea5( - i64* align 8 nocapture nofree nonnull %hp.0, +define private cc101 {%Hp,i64**,i64} @ea5( + %Hp %hp.0, i64** align 8 noalias nocapture nofree nonnull %globasp.0) nofree willreturn nosync nounwind argmemonly { - %ret.0 = tail call {i64*,i64**,i64} @s5(i64* %hp.0, i64** %globasp.0) - ret {i64*,i64**,i64} %ret.0 + %ret.0 = tail call cc101 {%Hp,i64**,i64} @s5(%Hp %hp.0, i64** %globasp.0) + ret {%Hp,i64**,i64} %ret.0 } -define private {i64*,i64**,i64} @s5( - i64* align 8 nocapture nofree nonnull %hp.0, +define private cc101 {%Hp,i64**,i64} @s5( + %Hp align 8 %hp.0, i64** align 8 noalias nocapture nofree nonnull %globasp.0) nofree willreturn nosync nounwind argmemonly { %astack = alloca i64*, i64 5 @@ -50,18 +50,18 @@ define private {i64*,i64**,i64} @s5( %bstack = alloca i64, i64 5 %bsp.000 = getelementptr i64, i64* %bstack, i64 4 - %t.0 = call {i64**,i64*} @buildI(i64 34, i64** %asp.000, i64* %hp.0) - %asp.001 = extractvalue {i64**,i64*} %t.0, 0 - %hp.1 = extractvalue {i64**,i64*} %t.0, 1 + %t.0 = call {i64**,%Hp} @buildI(i64 34, i64** %asp.000, %Hp %hp.0) + %asp.001 = extractvalue {i64**,%Hp} %t.0, 0 + %hp.1 = extractvalue {i64**,%Hp} %t.0, 1 %t.1 = call i64* @peek_a(i64** %asp.001) %asp.002 = call i64** @pop_a1(i64** %asp.001) - %t.2 = tail call {i64*,i64**,i64} @s4(i64* %hp.1, i64** %globasp.0, i64* %t.1) - ret {i64*,i64**,i64} %t.2 + %t.2 = tail call cc101 {%Hp,i64**,i64} @s4(%Hp %hp.1, i64** %globasp.0, i64* %t.1) + ret {%Hp,i64**,i64} %t.2 } -define {i64*,i64**,i64} @s4( - i64* align 8 nocapture nofree nonnull %hp.0, +define cc101 {%Hp,i64**,i64} @s4( + %Hp %hp.0, i64** align 8 noalias nocapture nofree nonnull %globasp.0, i64* align 8 nocapture nofree dereferenceable(3) %n) nofree willreturn nosync nounwind argmemonly { @@ -73,12 +73,12 @@ define {i64*,i64**,i64} @s4( %asp.001 = getelementptr i64*, i64** %asp.000, i64 1 store i64* %n, i64** %asp.001 - %asp.002 = call i64** @push_a(i64 -0, i64** %asp.001) - %j.0 = call {i64*,i64**} @jsr_eval(i64 -0, i64** %asp.002, i64** %asp.000, i64** %globasp.0, i64* %hp.0) - %hp.1 = extractvalue {i64*,i64**} %j.0, 0 - %globasp.1 = extractvalue {i64*,i64**} %j.0, 1 - %bsp.001 = call i64* @pushI_a(i64 -1, i64* %bsp.000, i64** %asp.002) - %asp.003 = call i64** @pop_a1(i64** %asp.002) + %asp.002 = getelementptr i64*, i64** %asp.001 ;%asp.002 = call i64** @push_a(i64 -0, i64** %asp.001) + %j.0 = call {%Hp,i64**} @jsr_eval(i64 -0, i64** %asp.002, i64** %asp.000, i64** %globasp.0, %Hp %hp.0) + %hp.1 = extractvalue {%Hp,i64**} %j.0, 0 + %globasp.1 = extractvalue {%Hp,i64**} %j.0, 1 + %bsp.001 = call i64* @pushI_a(i64 -0, i64* %bsp.000, i64** %asp.002) + %asp.003 = getelementptr i64*, i64** %asp.002 ;%asp.003 = call i64** @pop_a1(i64** %asp.002) %bsp.002 = call i64* @pushI(i64 2, i64* %bsp.001) %bsp.003 = call i64* @push_b(i64 1, i64* %bsp.002) %bsp.004 = call i64* @update_b(i64 1, i64 2, i64* %bsp.003) @@ -98,48 +98,48 @@ l.0: %t.2 = call i64 @peek_b(i64* %bsp.100) %bsp.101 = call i64* @pop_b1(i64* %bsp.100) - %ret.0 = insertvalue {i64*,i64**,i64} undef, i64* %hp.1, 0 - %ret.1 = insertvalue {i64*,i64**,i64} %ret.0, i64** %globasp.1, 1 - %ret.2 = insertvalue {i64*,i64**,i64} %ret.1, i64 %t.2, 2 - ret {i64*,i64**,i64} %ret.2 + %ret.0 = insertvalue {%Hp,i64**,i64} undef, %Hp %hp.1, 0 + %ret.1 = insertvalue {%Hp,i64**,i64} %ret.0, i64** %globasp.1, 1 + %ret.2 = insertvalue {%Hp,i64**,i64} %ret.1, i64 %t.2, 2 + ret {%Hp,i64**,i64} %ret.2 else.1: - %t.3 = call {i64**,i64*} @buildI(i64 1, i64** %asp.003, i64* %hp.1) - %asp.200 = extractvalue {i64**,i64*} %t.3, 0 - %hp.2 = extractvalue {i64**,i64*} %t.3, 1 + %t.3 = call {i64**,%Hp} @buildI(i64 1, i64** %asp.003, %Hp %hp.1) + %asp.200 = extractvalue {i64**,%Hp} %t.3, 0 + %hp.2 = extractvalue {i64**,%Hp} %t.3, 1 %asp.201 = call i64** @push_a(i64 -1, i64** %asp.200) - %t.4 = bitcast {i64*,i64**,i64*}(i64*,i64**,i64*)* @n2 to i64* - %t.5 = call {i64**,i64*} @build(i64* %t.4, i64 2, i64** %asp.201, i64** %asp.000, i64** %globasp.1, i64* %hp.2) - %asp.202 = extractvalue {i64**,i64*} %t.5, 0 - %hp.3 = extractvalue {i64**,i64*} %t.5, 1 + %t.4 = bitcast {%Hp,i64**,i64*}(%Hp,i64**,i64*)* @n2 to i64* + %t.5 = call {i64**,%Hp} @build(i64* %t.4, i64 2, i64** %asp.201, i64** %asp.000, i64** %globasp.1, %Hp %hp.2) + %asp.202 = extractvalue {i64**,%Hp} %t.5, 0 + %hp.3 = extractvalue {i64**,%Hp} %t.5, 1 %t.6 = call i64* @peek_a(i64** %asp.202) %asp.203 = call i64** @pop_a1(i64** %asp.202) - %t.7 = call {i64*,i64**,i64} @s4(i64* %hp.3, i64** %globasp.1, i64* %t.6) - %hp.4 = extractvalue {i64*,i64**,i64} %t.7, 0 - %globasp.2 = extractvalue {i64*,i64**,i64} %t.7, 1 - %t.8 = extractvalue {i64*,i64**,i64} %t.7, 2 + %t.7 = call cc101 {%Hp,i64**,i64} @s4(%Hp %hp.3, i64** %globasp.1, i64* %t.6) + %hp.4 = extractvalue {%Hp,i64**,i64} %t.7, 0 + %globasp.2 = extractvalue {%Hp,i64**,i64} %t.7, 1 + %t.8 = extractvalue {%Hp,i64**,i64} %t.7, 2 %bsp.200 = call i64* @pushI(i64 %t.8, i64* %bsp.008) - %t.9 = call {i64**,i64*} @buildI(i64 2, i64** %asp.203, i64* %hp.4) - %asp.204 = extractvalue {i64**,i64*} %t.9, 0 - %hp.5 = extractvalue {i64**,i64*} %t.9, 1 + %t.9 = call {i64**,%Hp} @buildI(i64 2, i64** %asp.203, %Hp %hp.4) + %asp.204 = extractvalue {i64**,%Hp} %t.9, 0 + %hp.5 = extractvalue {i64**,%Hp} %t.9, 1 %asp.205 = call i64** @push_a(i64 -1, i64** %asp.204) - %t.10 = bitcast {i64*,i64**,i64*}(i64*,i64**,i64*)* @n2 to i64* - %t.11 = call {i64**,i64*} @build(i64* %t.10, i64 2, i64** %asp.205, i64** %asp.000, i64** %globasp.2, i64* %hp.5) - %asp.206 = extractvalue {i64**,i64*} %t.11, 0 - %hp.6 = extractvalue {i64**,i64*} %t.11, 1 + %t.10 = bitcast {%Hp,i64**,i64*}(%Hp,i64**,i64*)* @n2 to i64* + %t.11 = call {i64**,%Hp} @build(i64* %t.10, i64 2, i64** %asp.205, i64** %asp.000, i64** %globasp.2, %Hp %hp.5) + %asp.206 = extractvalue {i64**,%Hp} %t.11, 0 + %hp.6 = extractvalue {i64**,%Hp} %t.11, 1 %t.12 = call i64* @peek_a(i64** %asp.206) %asp.207 = call i64** @pop_a1(i64** %asp.206) - %t.13 = call {i64*,i64**,i64} @s4(i64* %hp.6, i64** %globasp.2, i64* %t.12) - %hp.7 = extractvalue {i64*,i64**,i64} %t.13, 0 - %globasp.3 = extractvalue {i64*,i64**,i64} %t.13, 1 - %t.14 = extractvalue {i64*,i64**,i64} %t.13, 2 + %t.13 = call cc101 {%Hp,i64**,i64} @s4(%Hp %hp.6, i64** %globasp.2, i64* %t.12) + %hp.7 = extractvalue {%Hp,i64**,i64} %t.13, 0 + %globasp.3 = extractvalue {%Hp,i64**,i64} %t.13, 1 + %t.14 = extractvalue {%Hp,i64**,i64} %t.13, 2 %bsp.201 = call i64* @pushI(i64 %t.14, i64* %bsp.200) %bsp.202 = call i64* @addI(i64* %bsp.201) @@ -153,14 +153,14 @@ else.1: %t.15 = call i64 @peek_b(i64* %bsp.208) %bsp.209 = call i64* @pop_b1(i64* %bsp.208) - %ret.3 = insertvalue {i64*,i64**,i64} undef, i64* %hp.7, 0 - %ret.4 = insertvalue {i64*,i64**,i64} %ret.3, i64** %globasp.3, 1 - %ret.5 = insertvalue {i64*,i64**,i64} %ret.4, i64 %t.15, 2 - ret {i64*,i64**,i64} %ret.5 + %ret.3 = insertvalue {%Hp,i64**,i64} undef, %Hp %hp.7, 0 + %ret.4 = insertvalue {%Hp,i64**,i64} %ret.3, i64** %globasp.3, 1 + %ret.5 = insertvalue {%Hp,i64**,i64} %ret.4, i64 %t.15, 2 + ret {%Hp,i64**,i64} %ret.5 } -define {i64*,i64**,i64*} @n2( - i64* align 8 nocapture nofree nonnull %hp.0, +define cc101 {%Hp,i64**,i64*} @n2( + %Hp %hp.0, i64** align 8 noalias nocapture nofree nonnull %globasp.0, i64* align 8 nocapture nofree dereferenceable(3) %n) nofree willreturn nosync nounwind argmemonly align 8 @@ -181,10 +181,10 @@ define {i64*,i64**,i64*} @n2( %t.2 = call i64* @peek_a(i64** %asp.003) %asp.004 = call i64** @pop_a1(i64** %asp.003) %globasp.1 = call i64** @_push_local_astack(i64** %asp.004, i64** %asp.000, i64** %globasp.0) - %t.3 = call {i64*,i64**,i64} @ea2(i64* %hp.0, i64** %globasp.1, i64* %t.1, i64* %t.2) - %hp.1 = extractvalue {i64*,i64**,i64} %t.3, 0 - %globasp.2 = extractvalue {i64*,i64**,i64} %t.3, 1 - %t.4 = extractvalue {i64*,i64**,i64} %t.3, 2 + %t.3 = call cc101 {%Hp,i64**,i64} @ea2(%Hp %hp.0, i64** %globasp.1, i64* %t.1, i64* %t.2) + %hp.1 = extractvalue {%Hp,i64**,i64} %t.3, 0 + %globasp.2 = extractvalue {%Hp,i64**,i64} %t.3, 1 + %t.4 = extractvalue {%Hp,i64**,i64} %t.3, 2 %globasp.3 = call i64** @_pop_global_astack(i64** %asp.004, i64** %asp.000, i64** %globasp.2) %bsp.001 = call i64* @pushI(i64 %t.4, i64* %bsp.000) @@ -194,14 +194,14 @@ define {i64*,i64**,i64*} @n2( %t.5 = call i64* @peek_a(i64** %asp.005) %asp.006 = call i64** @pop_a1(i64** %asp.005) - %ret.0 = insertvalue {i64*,i64**,i64*} undef, i64* %hp.0, 0 - %ret.1 = insertvalue {i64*,i64**,i64*} %ret.0, i64** %globasp.3, 1 - %ret.2 = insertvalue {i64*,i64**,i64*} %ret.1, i64* %t.5, 2 - ret {i64*,i64**,i64*} %ret.2 + %ret.0 = insertvalue {%Hp,i64**,i64*} undef, %Hp %hp.1, 0 + %ret.1 = insertvalue {%Hp,i64**,i64*} %ret.0, i64** %globasp.3, 1 + %ret.2 = insertvalue {%Hp,i64**,i64*} %ret.1, i64* %t.5, 2 + ret {%Hp,i64**,i64*} %ret.2 } -define private {i64*,i64**,i64} @ea2( - i64* align 8 nocapture nofree nonnull %hp.0, +define private cc101 {%Hp,i64**,i64} @ea2( + %Hp %hp.0, i64** align 8 noalias nocapture nofree nonnull %globasp.0, i64* align 8 nofree nonnull %arg1, i64* align 8 nofree nonnull %arg2) @@ -216,12 +216,12 @@ define private {i64*,i64**,i64} @ea2( %asp.002 = getelementptr i64*, i64** %asp.001, i64 1 store i64* %arg1, i64** %asp.002 - %j.0 = call {i64*,i64**} @jsr_eval(i64 -1, i64** %asp.002, i64** %asp.000, i64** %globasp.0, i64* %hp.0) - %hp.1 = extractvalue {i64*,i64**} %j.0, 0 - %globasp.1 = extractvalue {i64*,i64**} %j.0, 1 - %j.1 = call {i64*,i64**} @jsr_eval(i64 -0, i64** %asp.002, i64** %asp.000, i64** %globasp.1, i64* %hp.1) - %hp.2 = extractvalue {i64*,i64**} %j.1, 0 - %globasp.2 = extractvalue {i64*,i64**} %j.1, 1 + %j.0 = call {%Hp,i64**} @jsr_eval(i64 -1, i64** %asp.002, i64** %asp.000, i64** %globasp.0, %Hp %hp.0) + %hp.1 = extractvalue {%Hp,i64**} %j.0, 0 + %globasp.1 = extractvalue {%Hp,i64**} %j.0, 1 + %j.1 = call {%Hp,i64**} @jsr_eval(i64 -0, i64** %asp.002, i64** %asp.000, i64** %globasp.1, %Hp %hp.1) + %hp.2 = extractvalue {%Hp,i64**} %j.1, 0 + %globasp.2 = extractvalue {%Hp,i64**} %j.1, 1 %bsp.001 = call i64* @pushI_a(i64 -1, i64* %bsp.000, i64** %asp.002) %bsp.002 = call i64* @pushI_a(i64 -0, i64* %bsp.001, i64** %asp.002) %asp.003 = call i64** @pop_a1(i64** %asp.002) @@ -232,15 +232,15 @@ define private {i64*,i64**,i64} @ea2( %t.1 = call i64 @peek_b(i64* %bsp.003) %bsp.004 = call i64* @pop_b1(i64* %bsp.003) - %ret = tail call {i64*,i64**,i64} @s2(i64* %hp.2, i64** %globasp.2, i64 %t.0, i64 %t.1) - ret {i64*,i64**,i64} %ret + %ret = tail call cc101 {%Hp,i64**,i64} @s2(%Hp %hp.2, i64** %globasp.2, i64 %t.0, i64 %t.1) + ret {%Hp,i64**,i64} %ret } -define private {i64*,i64**,i64} @s2( - i64* align 8 nocapture nofree nonnull %hp.0, +define private cc101 {%Hp,i64**,i64} @s2( + %Hp %hp.0, i64** align 8 noalias nocapture nofree nonnull %globasp.0, - i64 inreg %arg1, - i64 inreg %arg2) + i64 %arg1, + i64 %arg2) nofree willreturn nosync nounwind argmemonly { %astack = alloca i64*, i64 5 %asp.000 = getelementptr i64*, i64** %astack @@ -255,27 +255,42 @@ define private {i64*,i64**,i64} @s2( %t.0 = call i64 @peek_b(i64* %bsp.003) %bsp.004 = call i64* @pop_b1(i64* %bsp.003) - %ret.0 = insertvalue {i64*,i64**,i64} undef, i64* %hp.0, 0 - %ret.1 = insertvalue {i64*,i64**,i64} %ret.0, i64** %globasp.0, 1 - %ret.2 = insertvalue {i64*,i64**,i64} %ret.1, i64 %t.0, 2 - ret {i64*,i64**,i64} %ret.2 + %ret.0 = insertvalue {%Hp,i64**,i64} undef, %Hp %hp.0, 0 + %ret.1 = insertvalue {%Hp,i64**,i64} %ret.0, i64** %globasp.0, 1 + %ret.2 = insertvalue {%Hp,i64**,i64} %ret.1, i64 %t.0, 2 + ret {%Hp,i64**,i64} %ret.2 } define i64 @main() { - %hp.0 = call i64* @_alloc_heap(i64 100000000) +entry: + %hp_free.0 = add i64 100000000, 0 + %hp.0 = call i64* @_alloc_heap(i64 %hp_free.0) + %hp_s.0 = insertvalue %Hp undef, i64* %hp.0, 0 + %hp_s.1 = insertvalue %Hp %hp_s.0, i64 %hp_free.0, 1 + %asp.0 = call i64** @_alloc_a_stack(i64 10000) - %n.0 = getelementptr i64, i64* %hp.0 - store i64 ptrtoint ({i64*,i64**,i64*}(i64*,i64**,i64*)* @n5 to i64), i64* %n.0 - %hp.1 = getelementptr i64, i64* %hp.0, i64 3 + %i = add i64 20, 0 + br label %loop + +loop: + %i.0 = phi i64 [%i, %entry], [%i.1, %loop.0] + %i.1 = sub i64 %i.0, 1 + %c.0 = icmp slt i64 %i.1, 0 + br i1 %c.0, label %done, label %loop.0 + +loop.0: + %t.0 = bitcast {%Hp,i64**,i64*}(%Hp,i64**,i64*)* @n5 to i64* + %t.1 = call {i64**,%Hp} @build(i64* %t.0, i64 0, i64** %asp.0, i64** %asp.0, i64** %asp.0, %Hp %hp_s.1) + %asp.1 = extractvalue {i64**,%Hp} %t.1, 0 + %hp_s.2 = extractvalue {i64**,%Hp} %t.1, 1 - %t.0 = call {i64*,i64**,i64*} @n5(i64* %hp.1, i64** %asp.0, i64* %n.0) - %hp.2 = extractvalue {i64*,i64**,i64*} %t.0, 0 - %asp.1 = extractvalue {i64*,i64**,i64*} %t.0, 1 - %n.1 = extractvalue {i64*,i64**,i64*} %t.0, 2 + %t.2 = call cc101 {%Hp,i64**,i64*} @n5(%Hp %hp_s.2, i64** %asp.0, i64* %hp.0) + br label %loop - %n.1.0 = getelementptr i64, i64* %n.1, i64 1 - %r = load i64, i64* %n.1.0 +done: + %rp = getelementptr i64, i64* %hp.0, i64 1 + %r = load i64, i64* %rp 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) @@ -6,9 +6,12 @@ declare i64 @printf(i8*, ...) @printf_d = private unnamed_addr constant [3 x i8] c"%d\00", align 1 @printf_c = private unnamed_addr constant [3 x i8] c"%c\00", align 1 @printf_cycle = private unnamed_addr constant [16 x i8] c"cycle in spine\0a\00", align 1 +@printf_gc = private unnamed_addr constant [11 x i8] c"heap full\0a\00", align 1 attributes #0 = { alwaysinline } +%Hp = type {i64*,i64} + define private i64* @_alloc_heap(i64 %n) alwaysinline { %s.0 = alloca i64 %s.1 = getelementptr i64, i64* %s.0, i64 1 @@ -73,6 +76,22 @@ loop.0: br label %loop } +define private %Hp @_need_free_words(i64 %n, %Hp %hp_s.0) #0 { + %hp_free.0 = extractvalue %Hp %hp_s.0, 1 + %hp_free.1 = sub i64 %hp_free.0, %n + + %lt = icmp slt i64 %hp_free.1, 0 + br i1 %lt, label %gc, label %ok +ok: + %hp_s.1 = insertvalue %Hp %hp_s.0, i64 %hp_free.1, 1 + ret %Hp %hp_s.1 + +gc: + ; TODO + call i64 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @printf_gc, i64 0, i64 0)) + unreachable +} + define private i64* @addI(i64* %bsp.0) #0 { %t.0 = load i64, i64* %bsp.0 store i64 undef, i64* %bsp.0 @@ -83,27 +102,41 @@ define private i64* @addI(i64* %bsp.0) #0 { ret i64* %bsp.1 } -; TODO gc -; TODO for arity < 2, we must reserve more space on the heap -define private {i64**,i64*} @build(i64* %label, i64 %arity, i64** %asp.0, i64** %aspstart, i64** %globasp.0, i64* %hp.0) #0 { +define private {i64**,%Hp} @build(i64* %label, i64 %arity, i64** %asp.0, i64** %aspstart, i64** %globasp.0, %Hp %hp_s.0) #0 { entry: + %arity_p1 = add i64 %arity, 1 + %lt = icmp slt i64 %arity, 2 + br i1 %lt, label %arity_lt2, label %arity_ge2 + +arity_lt2: + br label %arity_ge2 + +arity_ge2: + %n_words = phi i64 [%arity_p1, %entry], [3, %arity_lt2] + %hp_s.1 = call %Hp @_need_free_words(i64 %arity_p1, %Hp %hp_s.0) + %hp.0 = extractvalue %Hp %hp_s.1, 0 + %hp_free.0 = extractvalue %Hp %hp_s.1, 1 + %label.0 = ptrtoint i64* %label to i64 store i64 %label.0, i64* %hp.0 %hp.1 = getelementptr i64, i64* %hp.0, i64 1 br label %loop loop: - %asp.1 = phi i64** [%asp.0, %entry], [%asp.2, %loop.0] - %hp.2 = phi i64* [%hp.1, %entry], [%hp.3, %loop.0] - %arity.0 = phi i64 [%arity, %entry], [%arity.1, %loop.0] + %asp.1 = phi i64** [%asp.0, %arity_ge2], [%asp.2, %loop.0] + %hp.2 = phi i64* [%hp.1, %arity_ge2], [%hp.3, %loop.0] + %arity.0 = phi i64 [%arity, %arity_ge2], [%arity.1, %loop.0] %t.0 = icmp eq i64 %arity.0, 0 br i1 %t.0, label %done, label %loop.0 done: %asp.3 = getelementptr i64*, i64** %asp.1, i64 1 store i64* %hp.0, i64** %asp.3 - %ret.0 = insertvalue {i64**,i64*} undef, i64** %asp.3, 0 - %ret.1 = insertvalue {i64**,i64*} %ret.0, i64* %hp.2, 1 - ret {i64**,i64*} %ret.1 + %ret.0 = insertvalue {i64**,%Hp} undef, i64** %asp.3, 0 + %hp.4 = getelementptr i64, i64* %hp.0, i64 %n_words + %hp_s.2 = insertvalue %Hp %hp_s.1, i64* %hp.4, 0 + %hp_s.3 = insertvalue %Hp %hp_s.2, i64 %hp_free.0, 1 ; TODO + %ret.1 = insertvalue {i64**,%Hp} %ret.0, %Hp %hp_s.3, 1 + ret {i64**,%Hp} %ret.1 loop.0: %t.1 = call i64* @peek_a(i64** %asp.1) @@ -115,11 +148,15 @@ loop.0: br label %loop } -; TODO pass aspstart for gc -define private {i64**,i64*} @buildI(i64 %i, i64** %asp.0, i64* %hp.0) #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* %hp.0 +define private {i64**,%Hp} @buildI(i64 %i, i64** %asp.0, %Hp %hp_s.0) #0 { + %hp_s.1 = call %Hp @_need_free_words(i64 2, %Hp %hp_s.0) + %hp.0 = extractvalue %Hp %hp_s.1, 0 + %hp_free.0 = extractvalue %Hp %hp_s.1, 1 + + %INT.0 = bitcast {i64, i64, i64*, i64, i8, i8, i8}* @INT to i8* + %INT.1 = getelementptr i8, i8* %INT.0, i64 2 + %INT.2 = ptrtoint i8* %INT.1 to i64 + store i64 %INT.2, i64* %hp.0 %hp.1 = getelementptr i64, i64* %hp.0, i64 1 store i64 %i, i64* %hp.1 @@ -128,9 +165,10 @@ define private {i64**,i64*} @buildI(i64 %i, i64** %asp.0, i64* %hp.0) #0 { store i64* %hp.0, i64** %asp.1 %hp.2 = getelementptr i64, i64* %hp.0, i64 2 - %ret.0 = insertvalue {i64**,i64*} undef, i64** %asp.1, 0 - %ret.1 = insertvalue {i64**,i64*} %ret.0, i64* %hp.2, 1 - ret {i64**,i64*} %ret.1 + %ret.0 = insertvalue {i64**,%Hp} undef, i64** %asp.1, 0 + %hp_s.2 = insertvalue %Hp %hp_s.1, i64* %hp.2, 0 + %ret.1 = insertvalue {i64**,%Hp} %ret.0, %Hp %hp_s.2, 1 + ret {i64**,%Hp} %ret.1 } define private i64* @eqI_b(i64 %i, i64 %n, i64* %bsp.0) #0 { @@ -150,9 +188,10 @@ define private i64** @fillI_b(i64 %b_offset, i64 %a_offset, i64* %bsp.0, i64** % %asp.1 = getelementptr i64*, i64** %asp.0, i64 %a_offset %n.0 = load i64*, i64** %asp.1 - %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 + %INT.0 = bitcast {i64, i64, i64*, i64, i8, i8, i8}* @INT to i8* + %INT.1 = getelementptr i8, i8* %INT.0, i64 2 + %INT.2 = ptrtoint i8* %INT.1 to i64 + store i64 %INT.2, i64* %n.0 %n.1 = getelementptr i64, i64* %n.0, i64 1 store i64 %t.0, i64* %n.1 @@ -160,7 +199,7 @@ define private i64** @fillI_b(i64 %b_offset, i64 %a_offset, i64* %bsp.0, i64** % ret i64** %asp.0 } -define private {i64*,i64**} @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %globasp.0, i64* %hp.0) #0 { +define private {%Hp,i64**} @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %globasp.0, %Hp %hp.0) #0 { %asp.1 = getelementptr i64*, i64** %asp.0, i64 %n %n.0 = load i64*, i64** %asp.1 @@ -171,23 +210,23 @@ define private {i64*,i64**} @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64 br i1 %t.1, label %eval, label %done done: - %r.0 = insertvalue {i64*,i64**} undef, i64* %hp.0, 0 - %r.1 = insertvalue {i64*,i64**} %r.0, i64** %globasp.0, 1 - ret {i64*,i64**} %r.1 + %r.0 = insertvalue {%Hp,i64**} undef, %Hp %hp.0, 0 + %r.1 = insertvalue {%Hp,i64**} %r.0, i64** %globasp.0, 1 + ret {%Hp,i64**} %r.1 eval: %globasp.1 = call i64** @_push_local_astack(i64** %asp.0, i64** %aspstart, i64** %globasp.0) - %nentry.0 = inttoptr i64 %d.0 to {i64*,i64**,i64*} (i64*, i64**, i64*)* - %t.2 = call {i64*,i64**,i64*} %nentry.0(i64* %hp.0, i64** %globasp.1, i64* %n.0) - %hp.1 = extractvalue {i64*,i64**,i64*} %t.2, 0 - %globasp.2 = extractvalue {i64*,i64**,i64*} %t.2, 1 - %n.1 = extractvalue {i64*,i64**,i64*} %t.2, 2 + %nentry.0 = inttoptr i64 %d.0 to {%Hp,i64**,i64*} (%Hp, i64**, i64*)* + %t.2 = call cc101 {%Hp,i64**,i64*} %nentry.0(%Hp %hp.0, i64** %globasp.1, i64* %n.0) + %hp.1 = extractvalue {%Hp,i64**,i64*} %t.2, 0 + %globasp.2 = extractvalue {%Hp,i64**,i64*} %t.2, 1 + %n.1 = extractvalue {%Hp,i64**,i64*} %t.2, 2 %globasp.3 = call i64** @_pop_global_astack(i64** %asp.0, i64** %aspstart, i64** %globasp.2) store i64* %n.1, i64** %asp.1 ; TODO this may not be needed? - %r.2 = insertvalue {i64*,i64**} undef, i64* %hp.1, 0 - %r.3 = insertvalue {i64*,i64**} %r.2, i64** %globasp.3, 1 - ret {i64*,i64**} %r.3 + %r.2 = insertvalue {%Hp,i64**} undef, %Hp %hp.1, 0 + %r.3 = insertvalue {%Hp,i64**} %r.2, i64** %globasp.3, 1 + ret {%Hp,i64**} %r.3 } define private i64* @ltI(i64* %bsp.0) #0 { |