mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
Only mark callee save regs as live on jumps that cannot be tracked.
* lib/lightning.c: Do not mark all registers in unknown state as live on jit_jmpr, or jit_jmpi to an absolute address. Instead, treat it as a function call, and only consider JIT_Vn registers as possibly live.
This commit is contained in:
parent
4f8d85b90d
commit
45c4df506c
2 changed files with 34 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2014-09-01 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
|
* lib/lightning.c: Do not mark all registers in unknown state
|
||||||
|
as live on jit_jmpr, or jit_jmpi to an absolute address. Instead,
|
||||||
|
treat it as a function call, and only consider JIT_Vn registers
|
||||||
|
as possibly live.
|
||||||
|
|
||||||
2014-08-29 Paulo Andrade <pcpa@gnu.org>
|
2014-08-29 Paulo Andrade <pcpa@gnu.org>
|
||||||
|
|
||||||
* doc/body.texi: Add a proper info menu entry for
|
* doc/body.texi: Add a proper info menu entry for
|
||||||
|
|
|
@ -2006,6 +2006,7 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
|
||||||
jit_regset_t *live, jit_regset_t *mask)
|
jit_regset_t *live, jit_regset_t *mask)
|
||||||
{
|
{
|
||||||
jit_int32_t spec;
|
jit_int32_t spec;
|
||||||
|
jit_int32_t regno;
|
||||||
jit_regset_t ztmp;
|
jit_regset_t ztmp;
|
||||||
jit_regset_t zmask;
|
jit_regset_t zmask;
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
|
@ -2165,6 +2166,32 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
/* Should not really mark as live all registers in unknown
|
||||||
|
* state if using jit_jmpr(), or jit_jmpi(absolute_address)
|
||||||
|
* because that would leave the register allocator with
|
||||||
|
* no options for "nospill" temporaries (other temporaries
|
||||||
|
* also benefit from not needing to spill/reload), so, the
|
||||||
|
* user must ensure to either spill/reload, or only leave
|
||||||
|
* live registers on JIT_Vn if using a jump that cannot
|
||||||
|
* be tracked around the generated jit code */
|
||||||
|
for (spec = JIT_R_NUM - 1; spec >= 0; spec--) {
|
||||||
|
regno = jit_r(spec);
|
||||||
|
if (jit_regset_tstbit(mask, regno))
|
||||||
|
jit_regset_clrbit(mask, regno);
|
||||||
|
}
|
||||||
|
for (spec = JIT_F_NUM - 1; spec >= 0; spec--) {
|
||||||
|
regno = jit_f(spec);
|
||||||
|
if (jit_regset_tstbit(mask, regno))
|
||||||
|
jit_regset_clrbit(mask, regno);
|
||||||
|
}
|
||||||
|
/* In some backends JIT_Rn and JIT_Fn are callee save */
|
||||||
|
for (regno = 0; regno < _jitc->reglen; regno++) {
|
||||||
|
spec = jit_class(_rvs[regno].spec);
|
||||||
|
if (jit_regset_tstbit(mask, regno) &&
|
||||||
|
(spec & (jit_class_gpr|jit_class_fpr)) &&
|
||||||
|
!(spec & jit_class_sav))
|
||||||
|
jit_regset_clrbit(mask, regno);
|
||||||
|
}
|
||||||
/* assume value is live due to jump to unknown location */
|
/* assume value is live due to jump to unknown location */
|
||||||
jit_regset_ior(live, live, mask);
|
jit_regset_ior(live, live, mask);
|
||||||
jit_regset_set_ui(mask, 0);
|
jit_regset_set_ui(mask, 0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue