aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile7
-rw-r--r--rts.ll17
2 files changed, 22 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index e30c528..27a0c15 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,12 @@ $(BC): %.bc: %.opt.ll
llvm-as-11 $^ -o $@
$(OPTLL): %.opt.ll: $(DEPS) %.ll
- cat $^ | opt-11 -S -O3 -o $@
+ cat $^ \
+ | opt-11 -S -always-inline \
+ | opt-11 -S -O3 \
+ | sed 's/noinline nounwind optnone/nounwind/' \
+ | opt-11 -S -O3 \
+ -o $@
clean:
$(RM) $(BIN) $(OBJ) $(ASM) $(BC)
diff --git a/rts.ll b/rts.ll
index 2a9b47a..c625a9f 100644
--- a/rts.ll
+++ b/rts.ll
@@ -53,6 +53,21 @@ loop.0:
br label %loop
}
+; TODO remove only the used positions
+define private void @_cleanup_global_astack(i64** %globasp.0) noinline optnone {
+ %globasp.0.1 = getelementptr i64*, i64** %globasp.0, i64 1
+ %globasp.0.2 = getelementptr i64*, i64** %globasp.0, i64 2
+ %globasp.0.3 = getelementptr i64*, i64** %globasp.0, i64 3
+ %globasp.0.4 = getelementptr i64*, i64** %globasp.0, i64 4
+ %globasp.0.5 = getelementptr i64*, i64** %globasp.0, i64 5
+ store i64* undef, i64** %globasp.0.1
+ store i64* undef, i64** %globasp.0.2
+ store i64* undef, i64** %globasp.0.3
+ store i64* undef, i64** %globasp.0.4
+ store i64* undef, i64** %globasp.0.5
+ ret void
+}
+
define private i64* @addI(i64* %bsp.0) #0 {
%t.0 = load i64, i64* %bsp.0
store i64 undef, i64* %bsp.0
@@ -141,7 +156,6 @@ define private i64** @fillI_b(i64 %b_offset, i64 %a_offset, i64* %bsp.0, i64** %
}
define private i64* @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %globasp.0, i64* %hp.0) #0 {
- ; TODO in case %n != 0 do we need to push it to the top of the stack?
%asp.1 = getelementptr i64*, i64** %asp.0, i64 %n
%n.0 = load i64*, i64** %asp.1
@@ -158,6 +172,7 @@ 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*)*
%t.2 = call {i64*, i64*} %nentry.0(i64* %hp.0, i64** %globasp.1, i64* %n.0)
+ call void @_cleanup_global_astack(i64** %globasp.0)
%hp.1 = extractvalue {i64*, i64*} %t.2, 0
%n.1 = extractvalue {i64*, i64*} %t.2, 1
store i64* %n.1, i64** %asp.1