diff mbox

[v3,1/2] tcg: fix register allocation with two aliased dead inputs

Message ID 1433447228-29425-2-git-send-email-aurelien@aurel32.net
State New
Headers show

Commit Message

Aurelien Jarno June 4, 2015, 7:47 p.m. UTC
For TCG ops with two outputs registers (add2, sub2, div2, div2u), when
the same input temp is used for the two inputs aliased to the two
outputs, and when these inputs are both dead, the register allocation
code wrongly assigned the same register to the same output.

This happens for example with sub2 t1, t2, t3, t3, t4, t5, when t3 is
not used anymore after the TCG op.  In that case the same register is
used for t1, t2 and t3.

The fix is to look for already allocated aliased input when allocating
a dead aliased input and check that the register is not already
used.

Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Richard Henderson June 4, 2015, 9:17 p.m. UTC | #1
On 06/04/2015 12:47 PM, Aurelien Jarno wrote:
> For TCG ops with two outputs registers (add2, sub2, div2, div2u), when
> the same input temp is used for the two inputs aliased to the two
> outputs, and when these inputs are both dead, the register allocation
> code wrongly assigned the same register to the same output.
> 
> This happens for example with sub2 t1, t2, t3, t3, t4, t5, when t3 is
> not used anymore after the TCG op.  In that case the same register is
> used for t1, t2 and t3.
> 
> The fix is to look for already allocated aliased input when allocating
> a dead aliased input and check that the register is not already
> used.
> 
> Cc: Richard Henderson <rth@twiddle.net>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>  tcg/tcg.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)

Reviewed-by: Richard Henderson <rth@twiddle.net>


r~
diff mbox

Patch

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 8b43bbb..c5e2ce9 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1998,6 +1998,16 @@  static void tcg_reg_alloc_op(TCGContext *s,
                 if (!IS_DEAD_ARG(i)) {
                     goto allocate_in_reg;
                 }
+                /* check if the current register has already been allocated
+                   for another input aliased to an output */
+                int k2, i2;
+                for (k2 = 0 ; k2 < k ; k2++) {
+                    i2 = def->sorted_args[nb_oargs + k2];
+                    if ((def->args_ct[i2].ct & TCG_CT_IALIAS) &&
+                        (new_args[i2] == ts->reg)) {
+                        goto allocate_in_reg;
+                    }
+                }
             }
         }
         reg = ts->reg;