aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile19
-rw-r--r--fib_eqI_b.ll107
-rw-r--r--nfib_nsa.icl23
-rw-r--r--nfib_nsa.ll211
-rw-r--r--rts.ll103
5 files changed, 276 insertions, 187 deletions
diff --git a/Makefile b/Makefile
index 27a0c15..6dd3894 100644
--- a/Makefile
+++ b/Makefile
@@ -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)
diff --git a/rts.ll b/rts.ll
index c0f4a86..180a683 100644
--- a/rts.ll
+++ b/rts.ll
@@ -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 {