on master help sign in
Small runtime performance tweak

Avoiding needless setting values when we're going to write there anyway.

commit24a083f3ae5a28427959a453a9671f98de065325 authorEdwin Brady <ecb10@st-andrews.ac.uk> dateSat 28 Sep 2019, 20:31 (7 years ago) parentac930f3
3 files changed+8−2
rts/idris_rts.h+3 src/IRTS/Bytecode.hs+3−2 src/IRTS/CodegenC.hs+2
rts/idris_rts.h+3
@@ -291,6 +291,9 @@ typedef intptr_t i_int;
291291 if (vm->valstack_top+(x) > vm->stack_max) { stackOverflow(); } \
292292 else { memset(vm->valstack_top, 0, (x)*sizeof(VAL)); } \
293293 } while(0)
294+#define RESERVENOALLOC(x) do { \
295+ if (vm->valstack_top+(x) > vm->stack_max) { stackOverflow(); } \
296+ } while(0)
294297#define ADDTOP(x) vm->valstack_top += (x)
295298#define TOPBASE(x) vm->valstack_top = vm->valstack_base + (x)
296299#define BASETOP(x) vm->valstack_base = vm->valstack_top + (x)
src/IRTS/Bytecode.hs+3−2
@@ -86,6 +86,7 @@ data BC =
8686 -- | reserve n more stack items (i.e. check there's space, grow if
8787 -- necessary)
8888 | RESERVE Int
89+ | RESERVENOALLOC Int
8990
9091 -- | move the top of stack up
9192 | ADDTOP Int
@@ -127,13 +128,13 @@ bc reg (SV (Loc i)) r = assign reg (L i) ++ clean r
127128bc reg (SApp False f vs) r =
128129 if argCount == 0
129130 then moveReg 0 vs ++ [STOREOLD, BASETOP 0, CALL f] ++ ret
130− else RESERVE argCount : moveReg 0 vs ++
131+ else RESERVENOALLOC argCount : moveReg 0 vs ++
131132 [STOREOLD, BASETOP 0, ADDTOP argCount, CALL f] ++ ret
132133 where
133134 ret = assign reg RVal ++ clean r
134135 argCount = length vs
135136bc reg (SApp True f vs) r
136− = RESERVE (length vs) : moveReg 0 vs
137+ = RESERVENOALLOC (length vs) : moveReg 0 vs
137138 ++ [SLIDE (length vs), TOPBASE (length vs), TAILCALL f]
138139bc reg (SForeign t fname args) r
139140 = FOREIGNCALL reg t fname (map farg args) : clean r
src/IRTS/CodegenC.hs+2
@@ -321,6 +321,8 @@ bcc f i (SLIDE n) = indent i ++ "SLIDE(vm, " ++ show n ++ ");\n"
321321bcc f i REBASE = indent i ++ "REBASE;\n"
322322bcc f i (RESERVE 0) = ""
323323bcc f i (RESERVE n) = indent i ++ "RESERVE(" ++ show n ++ ");\n"
324+bcc f i (RESERVENOALLOC 0) = ""
325+bcc f i (RESERVENOALLOC n) = indent i ++ "RESERVENOALLOC(" ++ show n ++ ");\n"
324326bcc f i (ADDTOP 0) = ""
325327bcc f i (ADDTOP n) = indent i ++ "ADDTOP(" ++ show n ++ ");\n"
326328bcc f i (TOPBASE n) = indent i ++ "TOPBASE(" ++ show n ++ ");\n"