diff options
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | rts.ll | 17 |
2 files changed, 22 insertions, 2 deletions
@@ -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) @@ -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 |