1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-21 19:20:21 +02:00

Always mark return registers as live in epilog

* lib/lightning.c: Always mark JIT_RET and JIT_FRET as
	live in a function epilog. This is required because
	on some ports a complex sequence, allocating one or more
	registers, may be required to jump from a ret* to the
	epilog, and the lightning api does not have annotations
	to know if a function returns a value, or the type of
	the return value.
This commit is contained in:
pcpa 2014-08-10 11:39:53 -03:00
parent f79f9777b1
commit 53dd28d682
2 changed files with 29 additions and 1 deletions

View file

@ -1,3 +1,13 @@
2014-08-10 Paulo Andrade <pcpa@gnu.org>
* lib/lightning.c: Always mark JIT_RET and JIT_FRET as
live in a function epilog. This is required because
on some ports a complex sequence, allocating one or more
registers, may be required to jump from a ret* to the
epilog, and the lightning api does not have annotations
to know if a function returns a value, or the type of
the return value.
2014-08-10 Paulo Andrade <pcpa@gnu.org> 2014-08-10 Paulo Andrade <pcpa@gnu.org>
* lib/lightning.c: Change the correct live bitmask of * lib/lightning.c: Change the correct live bitmask of

View file

@ -2029,9 +2029,27 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
jit_regset_and(mask, mask, &ztmp); jit_regset_and(mask, mask, &ztmp);
} }
break; break;
case jit_code_prolog: case jit_code_epilog: case jit_code_prolog:
jit_regset_set_ui(mask, 0); jit_regset_set_ui(mask, 0);
return; return;
case jit_code_epilog:
jit_regset_set_ui(mask, 0);
#if defined(JIT_RET)
/* On some backends it may be required to allocate one
* or more registers to jump from a jit_ret* to the
* epilog label.
* Because currently there is no type information,
* assume JIT_RET and JIT_FRET are live in the epilog.
* Only JIT_RET really should be marked as live, to
* prevent it being allocated, usually in the jump to
* the epilog, but also mark JIT_FRET as live for the
* sake of correctness. */
jit_regset_setbit(live, JIT_RET);
#endif
#if defined(JIT_FRET)
jit_regset_setbit(live, JIT_FRET);
#endif
return;
case jit_code_callr: case jit_code_callr:
value = jit_regno(node->u.w); value = jit_regno(node->u.w);
if (!(node->u.w & jit_regno_patch)) { if (!(node->u.w & jit_regno_patch)) {