Patchwork [10/13] tcg: don't explicitely save globals and temps

login
register
mail settings
Submitter Aurelien Jarno
Date Sept. 27, 2012, 5:15 p.m.
Message ID <1348766113-18373-11-git-send-email-aurelien@aurel32.net>
Download mbox | patch
Permalink /patch/187441/
State New
Headers show

Comments

Aurelien Jarno - Sept. 27, 2012, 5:15 p.m.
The liveness analysis ensures that globals and temps are at the correct
state at a basic block end or with an op with side effects. Avoid
looping on all temps, this can be time consuming on targets with a lot
of globals. Keep an assert in debug mode.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)
Richard Henderson - Sept. 27, 2012, 7:13 p.m.
On 09/27/2012 10:15 AM, Aurelien Jarno wrote:
> @@ -1706,11 +1718,9 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
>          if (!ots->mem_allocated) {
>              temp_allocate_frame(s, args[0]);
>          }
> -        if (ts->val_type == TEMP_VAL_REG) {
> -            tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
> -            if (IS_DEAD_ARG(1)) {
> -                temp_dead(s, args[1]);
> -            }
> +        tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
> +        if (IS_DEAD_ARG(1)) {
> +            temp_dead(s, args[1]);
>          }
>          temp_dead(s, args[0]);
>      } else if (ts->val_type == TEMP_VAL_CONST) {

Did this hunk belong to a different patch?  It seems like it belongs
with the tcg_reg_alloc_mov rewrite.

If it actually depends on patches 7-8, then perhaps a reorder is better.


r~
Aurelien Jarno - Sept. 27, 2012, 8:23 p.m.
On Thu, Sep 27, 2012 at 12:13:25PM -0700, Richard Henderson wrote:
> On 09/27/2012 10:15 AM, Aurelien Jarno wrote:
> > @@ -1706,11 +1718,9 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
> >          if (!ots->mem_allocated) {
> >              temp_allocate_frame(s, args[0]);
> >          }
> > -        if (ts->val_type == TEMP_VAL_REG) {
> > -            tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
> > -            if (IS_DEAD_ARG(1)) {
> > -                temp_dead(s, args[1]);
> > -            }
> > +        tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
> > +        if (IS_DEAD_ARG(1)) {
> > +            temp_dead(s, args[1]);
> >          }
> >          temp_dead(s, args[0]);
> >      } else if (ts->val_type == TEMP_VAL_CONST) {
> 
> Did this hunk belong to a different patch?  It seems like it belongs
> with the tcg_reg_alloc_mov rewrite.

Yes, it was a simplification meant to go in the patch 7, but it ended up
at the wrong place (the assert above already ensure that ts->val_type ==
TEMP_VAL_REG.

I'll move it to the write patch.

> If it actually depends on patches 7-8, then perhaps a reorder is better.
> 
> 
> r~
> 
>

Patch

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 9e12be8..2f973e8 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1601,8 +1601,14 @@  static inline void temp_sync(TCGContext *s, int temp, TCGRegSet allocated_regs)
    temporary registers needs to be allocated to store a constant. */
 static inline void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
 {
+#ifdef USE_LIVENESS_ANALYSIS
+    /* The liveness analysis already ensures that globals are back
+       in memory. Keep an assert for safety. */
+    assert(s->temps[temp].val_type == TEMP_VAL_MEM || s->temps[temp].fixed_reg);
+#else
     temp_sync(s, temp, allocated_regs);
     temp_dead(s, temp);
+#endif
 }
 
 /* save globals to their canonical location and assume they can be
@@ -1629,7 +1635,13 @@  static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs)
         if (ts->temp_local) {
             temp_save(s, i, allocated_regs);
         } else {
+#ifdef USE_LIVENESS_ANALYSIS
+            /* The liveness analysis already ensures that temps are dead.
+               Keep an assert for safety. */
+            assert(ts->val_type == TEMP_VAL_DEAD);
+#else
             temp_dead(s, i);
+#endif
         }
     }
 
@@ -1706,11 +1718,9 @@  static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
         if (!ots->mem_allocated) {
             temp_allocate_frame(s, args[0]);
         }
-        if (ts->val_type == TEMP_VAL_REG) {
-            tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
-            if (IS_DEAD_ARG(1)) {
-                temp_dead(s, args[1]);
-            }
+        tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
+        if (IS_DEAD_ARG(1)) {
+            temp_dead(s, args[1]);
         }
         temp_dead(s, args[0]);
     } else if (ts->val_type == TEMP_VAL_CONST) {