From 59f32e85c3c9df698d244f41ff56d3b3e4ecb0d8 Mon Sep 17 00:00:00 2001 From: pcpa Date: Wed, 31 Jan 2018 17:09:29 -0500 Subject: [PATCH] Add extra argument to jit_update to prevent recursion on branches * lib/lightning.c: Avoid deep recursions when computing live register ranges. --- ChangeLog | 5 +++++ lib/lightning.c | 24 +++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index eea7ae000..ef5af5501 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-01-31 Paulo Andrade + + * lib/lightning.c: Avoid deep recursions when computing live + register ranges. + 2018-01-31 Paulo Andrade * lib/jit_mips-cpu.c: Correct frame size and varargs diff --git a/lib/lightning.c b/lib/lightning.c index 57f562311..166aebf93 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -91,10 +91,10 @@ _jit_dataset(jit_state_t *_jit); static void _jit_setup(jit_state_t *_jit, jit_block_t *block); -#define jit_update(node, live, mask) _jit_update(_jit, node, live, mask) +#define jit_update(node, live, mask, r) _jit_update(_jit, node, live, mask, r) static void _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_bool_t recurse); #define thread_jumps() _thread_jumps(_jit) static void @@ -1574,7 +1574,7 @@ _jit_optimize(jit_state_t *_jit) continue; if (block->label->code != jit_code_epilog) { jit_regset_set(&_jitc->regmask, &block->regmask); - jit_update(block->label->next, &block->reglive, &_jitc->regmask); + jit_update(block->label->next, &block->reglive, &_jitc->regmask, 1); } } /* do a second pass from start to properly handle some conditions @@ -1587,7 +1587,7 @@ _jit_optimize(jit_state_t *_jit) continue; if (block->label->code != jit_code_epilog) { jit_regset_set(&_jitc->regmask, &block->setmask); - jit_update(block->label->next, &block->reglive, &_jitc->regmask); + jit_update(block->label->next, &block->reglive, &_jitc->regmask, 1); } } @@ -1767,7 +1767,7 @@ _jit_reglive(jit_state_t *_jit, jit_node_t *node) } if (jit_regset_set_p(&_jitc->regmask)) { bmp_zero(); - jit_update(node->next, &_jitc->reglive, &_jitc->regmask); + jit_update(node->next, &_jitc->reglive, &_jitc->regmask, 1); if (jit_regset_set_p(&_jitc->regmask)) { /* any unresolved live state is considered as live */ jit_regset_ior(&_jitc->reglive, @@ -2193,7 +2193,7 @@ _jit_setup(jit_state_t *_jit, jit_block_t *block) */ static void _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_bool_t recurse) { jit_int32_t spec; jit_int32_t regno; @@ -2313,8 +2313,14 @@ _jit_update(jit_state_t *_jit, jit_node_t *node, if (jit_regset_set_p(mask) == 0) return; /* restore mask if branch is conditional */ - jit_regset_set(&zmask, mask); - jit_update(block->label->next, live, &zmask); + if (recurse) { + jit_regset_set(&zmask, mask); + jit_update(block->label->next, live, &zmask, 0); + } + else { + node = block->label->next; + goto restart; + } jit_regset_xor(&ztmp, &zmask, mask); /* remove known live registers from mask */ if (jit_regset_set_p(&ztmp)) { @@ -3124,7 +3130,7 @@ _spill_reglive_p(jit_state_t *_jit, jit_node_t *node, jit_int32_t regno) if (!jit_regset_tstbit(&_jitc->reglive, regno)) { bmp_zero(); jit_regset_setbit(&_jitc->regmask, regno); - jit_update(node->next, &_jitc->reglive, &_jitc->regmask); + jit_update(node->next, &_jitc->reglive, &_jitc->regmask, 1); if (!jit_regset_tstbit(&_jitc->reglive, regno) && register_change_p(node->next, node->link, regno) != jit_reg_change) return (0);