From ddd7381828ef7c791867917f2eb32e9cba66079f Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Fri, 8 Jan 2021 11:38:53 +0100 Subject: WIP: cleanup global A stack after evaluation in jsr_eval --- Makefile | 7 ++++++- rts.ll | 17 ++++++++++++++++- 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 -- cgit v1.2.3