From: Aleksey Demakov Date: Sun, 6 Jul 2008 09:07:18 +0000 (+0000) Subject: fix problem with global registers and commutative ops X-Git-Tag: before.move.to.git~63 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=018bfa1a9f2dc676747411c0e579a695e1c28c4d;p=francis%2Flibjit.git fix problem with global registers and commutative ops --- diff --git a/ChangeLog b/ChangeLog index 66a9f56..f254901 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-07-06 Juan Jesus Garcia de Soria + + * jit/jit-reg-alloc.c (choose_input_order): take into account global + registers to see if it is suitable to exchange input values. This + fixes a problem that took place when a commutative op is applied to + a value that resides in a global register and is both the dest and + the second source value of the op. + 2008-05-30 Aleksey Demakov * include/jit/jit-common.h: remove unused jit_function_compiled_t diff --git a/jit/jit-reg-alloc.c b/jit/jit-reg-alloc.c index 1394aa4..4f46098 100644 --- a/jit/jit-reg-alloc.c +++ b/jit/jit-reg-alloc.c @@ -1219,6 +1219,8 @@ choose_output_register(jit_gencode_t gen, _jit_regs_t *regs) { if(regs->commutative) { + /* This depends on choose_input_order() + doing its job on the next step. */ use_cost = 0; } else @@ -1273,11 +1275,15 @@ choose_output_register(jit_gencode_t gen, _jit_regs_t *regs) { if(regs->commutative) { + /* This depends on choose_input_order() + doing its job on the next step. */ use_cost = 0; } #ifdef JIT_REG_STACK else if(regs->reversible && regs->no_pop) { + /* This depends on choose_input_order() + doing its job on the next step. */ use_cost = 0; } #endif @@ -1336,10 +1342,14 @@ choose_output_register(jit_gencode_t gen, _jit_regs_t *regs) static void choose_input_order(jit_gencode_t gen, _jit_regs_t *regs) { - if(regs->descs[2].value - && regs->descs[2].value->in_register - && regs->descs[2].value->reg == regs->descs[0].reg - && regs->descs[2].value != regs->descs[1].value) + jit_value_t value; + + value = regs->descs[2].value; + if(value && value != regs->descs[1].value + && ((value->in_register + && value->reg == regs->descs[0].reg) + || (value->in_global_register + && value->global_reg == regs->descs[0].reg))) { #ifdef JIT_REG_STACK if(regs->reversible && regs->no_pop)