diff --git a/ChangeLog b/ChangeLog index ef5af5501..2c0a4ae01 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2018-02-22 Paulo Andrade + + * lib/jit_aarch64.c, lib/jit_alpha.c, lib/jit_arm.c, + lib/jit_mips.c, lib/jit_ppc.c, lib/jit_sparc.c, lib/jit_x86.c: + Correct wrong logic in usage of jit_live in jit_retr. The + problem is that if a temporary is required during epilog, + the return register might be allocated, so, jit_live must always + be used. + 2018-01-31 Paulo Andrade * lib/lightning.c: Avoid deep recursions when computing live diff --git a/lib/jit_aarch64.c b/lib/jit_aarch64.c index 6770f31ee..c1fb11d9f 100644 --- a/lib/jit_aarch64.c +++ b/lib/jit_aarch64.c @@ -263,8 +263,7 @@ _jit_retr(jit_state_t *_jit, jit_int32_t u) jit_inc_synth_w(retr, u); if (JIT_RET != u) jit_movr(JIT_RET, u); - else - jit_live(JIT_RET); + jit_live(JIT_RET); jit_ret(); jit_dec_synth(); } diff --git a/lib/jit_alpha.c b/lib/jit_alpha.c index 9d1d41e5b..90f8556c4 100644 --- a/lib/jit_alpha.c +++ b/lib/jit_alpha.c @@ -251,8 +251,7 @@ _jit_retr(jit_state_t *_jit, jit_int32_t u) jit_inc_synth_w(retr, u); if (JIT_RET != u) jit_movr(JIT_RET, u); - else - jit_live(JIT_RET); + jit_live(JIT_RET); jit_ret(); jit_dec_synth(); } @@ -329,7 +328,7 @@ _jit_arg_register_p(jit_state_t *_jit, jit_node_t *u) void _jit_ellipsis(jit_state_t *_jit) { - jit_inc_synth(jit_code_ellipsis); + jit_inc_synth(ellipsis); if (_jitc->prepare) { jit_link_prepare(); assert(!(_jitc->function->call.call & jit_call_varargs)); diff --git a/lib/jit_arm.c b/lib/jit_arm.c index 923053410..6e73b1dfd 100644 --- a/lib/jit_arm.c +++ b/lib/jit_arm.c @@ -331,8 +331,7 @@ _jit_retr(jit_state_t *_jit, jit_int32_t u) jit_inc_synth_w(retr, u); if (JIT_RET != u) jit_movr(JIT_RET, u); - else - jit_live(JIT_RET); + jit_live(JIT_RET); jit_ret(); jit_dec_synth(); } diff --git a/lib/jit_mips.c b/lib/jit_mips.c index 3e1658d61..53fa22e70 100644 --- a/lib/jit_mips.c +++ b/lib/jit_mips.c @@ -264,8 +264,7 @@ _jit_retr(jit_state_t *_jit, jit_int32_t u) jit_inc_synth_w(retr, u); if (JIT_RET != u) jit_movr(JIT_RET, u); - else - jit_live(JIT_RET); + jit_live(JIT_RET); jit_ret(); jit_dec_synth(); } diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c index 52a37d377..2c8a8141e 100644 --- a/lib/jit_ppc.c +++ b/lib/jit_ppc.c @@ -246,8 +246,7 @@ _jit_retr(jit_state_t *_jit, jit_int32_t u) jit_inc_synth_w(retr, u); if (JIT_RET != u) jit_movr(JIT_RET, u); - else - jit_live(JIT_RET); + jit_live(JIT_RET); jit_ret(); jit_dec_synth(); } diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c index 25e4caae0..2df67e45d 100644 --- a/lib/jit_sparc.c +++ b/lib/jit_sparc.c @@ -205,8 +205,7 @@ _jit_retr(jit_state_t *_jit, jit_int32_t u) jit_inc_synth_w(retr, u); if (JIT_RET != u) jit_movr(JIT_RET, u); - else - jit_live(JIT_RET); + jit_live(JIT_RET); jit_ret(); jit_dec_synth(); } diff --git a/lib/jit_x86.c b/lib/jit_x86.c index 7ec621ab3..0bbce1ad8 100644 --- a/lib/jit_x86.c +++ b/lib/jit_x86.c @@ -507,8 +507,7 @@ _jit_retr(jit_state_t *_jit, jit_int32_t u) if (JIT_RET != u) jit_movr(JIT_RET, u); /* explicitly tell it is live */ - else - jit_live(JIT_RET); + jit_live(JIT_RET); jit_ret(); jit_dec_synth(); }