diff mbox

[for-2.5,03/10] tcg/optimize: track const/copy status separately

Message ID 1437755447-10537-4-git-send-email-aurelien@aurel32.net
State New
Headers show

Commit Message

Aurelien Jarno July 24, 2015, 4:30 p.m. UTC
Use two bools to track constants and copies instead of an enum.

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

Comments

Paolo Bonzini July 27, 2015, 8:25 a.m. UTC | #1
On 24/07/2015 18:30, Aurelien Jarno wrote:
> Use two bools to track constants and copies instead of an enum.
> 
> Cc: Richard Henderson <rth@twiddle.net>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>  tcg/optimize.c | 30 +++++++++++++++---------------
>  1 file changed, 15 insertions(+), 15 deletions(-)
> 
> diff --git a/tcg/optimize.c b/tcg/optimize.c
> index d2b63a4..f16eb1e 100644
> --- a/tcg/optimize.c
> +++ b/tcg/optimize.c
> @@ -35,14 +35,9 @@
>          glue(glue(case INDEX_op_, x), _i32):    \
>          glue(glue(case INDEX_op_, x), _i64)
>  
> -typedef enum {
> -    TCG_TEMP_UNDEF = 0,
> -    TCG_TEMP_CONST,
> -    TCG_TEMP_COPY,
> -} tcg_temp_state;
> -
>  struct tcg_temp_info {
> -    tcg_temp_state state;
> +    bool is_const;
> +    bool is_copy;

Could temps[arg].is_copy be replaced by temps[arg].next_copy != arg?

For example, this:

    if (temps[temp].prev_copy == temps[temp].next_copy) {
        temps[temps[temp].next_copy].is_copy = false;
    } else {
        temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
        temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
    }

would be replaced simply by

    temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
    temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;

Paolo

>      uint16_t prev_copy;
>      uint16_t next_copy;
>      tcg_target_ulong val;
> @@ -54,12 +49,12 @@ static TCGTempSet temps_used;
>  
>  static inline bool temp_is_const(TCGArg arg)
>  {
> -    return temps[arg].state == TCG_TEMP_CONST;
> +    return temps[arg].is_const;
>  }
>  
>  static inline bool temp_is_copy(TCGArg arg)
>  {
> -    return temps[arg].state == TCG_TEMP_COPY;
> +    return temps[arg].is_copy;
>  }
>  
>  /* Reset TEMP's state to TCG_TEMP_UNDEF.  If TEMP only had one copy, remove
> @@ -68,13 +63,14 @@ static void reset_temp(TCGArg temp)
>  {
>      if (temp_is_copy(temp)) {
>          if (temps[temp].prev_copy == temps[temp].next_copy) {
> -            temps[temps[temp].next_copy].state = TCG_TEMP_UNDEF;
> +            temps[temps[temp].next_copy].is_copy = false;
>          } else {
>              temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
>              temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
>          }
>      }
> -    temps[temp].state = TCG_TEMP_UNDEF;
> +    temps[temp].is_const = false;
> +    temps[temp].is_copy = false;
>      temps[temp].mask = -1;
>  }
>  
> @@ -88,7 +84,8 @@ static void reset_all_temps(int nb_temps)
>  static void init_temp_info(TCGArg temp)
>  {
>      if (!test_bit(temp, temps_used.l)) {
> -        temps[temp].state = TCG_TEMP_UNDEF;
> +        temps[temp].is_const = false;
> +        temps[temp].is_copy = false;
>          temps[temp].mask = -1;
>          set_bit(temp, temps_used.l);
>      }
> @@ -218,7 +215,8 @@ static void tcg_opt_gen_movi(TCGContext *s, TCGOp *op, TCGArg *args,
>      op->opc = new_op;
>  
>      reset_temp(dst);
> -    temps[dst].state = TCG_TEMP_CONST;
> +    temps[dst].is_const = true;
> +    temps[dst].is_copy = false;
>      temps[dst].val = val;
>      mask = val;
>      if (TCG_TARGET_REG_BITS > 32 && new_op == INDEX_op_movi_i32) {
> @@ -261,11 +259,13 @@ static void tcg_opt_gen_mov(TCGContext *s, TCGOp *op, TCGArg *args,
>  
>      if (s->temps[src].type == s->temps[dst].type) {
>          if (!temp_is_copy(src)) {
> -            temps[src].state = TCG_TEMP_COPY;
> +            temps[src].is_const = false;
> +            temps[src].is_copy = true;
>              temps[src].next_copy = src;
>              temps[src].prev_copy = src;
>          }
> -        temps[dst].state = TCG_TEMP_COPY;
> +        temps[dst].is_const = false;
> +        temps[dst].is_copy = true;
>          temps[dst].next_copy = temps[src].next_copy;
>          temps[dst].prev_copy = src;
>          temps[temps[dst].next_copy].prev_copy = dst;
>
Aurelien Jarno July 27, 2015, 9:10 a.m. UTC | #2
On 2015-07-27 10:25, Paolo Bonzini wrote:
> 
> 
> On 24/07/2015 18:30, Aurelien Jarno wrote:
> > Use two bools to track constants and copies instead of an enum.
> > 
> > Cc: Richard Henderson <rth@twiddle.net>
> > Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> > ---
> >  tcg/optimize.c | 30 +++++++++++++++---------------
> >  1 file changed, 15 insertions(+), 15 deletions(-)
> > 
> > diff --git a/tcg/optimize.c b/tcg/optimize.c
> > index d2b63a4..f16eb1e 100644
> > --- a/tcg/optimize.c
> > +++ b/tcg/optimize.c
> > @@ -35,14 +35,9 @@
> >          glue(glue(case INDEX_op_, x), _i32):    \
> >          glue(glue(case INDEX_op_, x), _i64)
> >  
> > -typedef enum {
> > -    TCG_TEMP_UNDEF = 0,
> > -    TCG_TEMP_CONST,
> > -    TCG_TEMP_COPY,
> > -} tcg_temp_state;
> > -
> >  struct tcg_temp_info {
> > -    tcg_temp_state state;
> > +    bool is_const;
> > +    bool is_copy;
> 
> Could temps[arg].is_copy be replaced by temps[arg].next_copy != arg?
> 
> For example, this:
> 
>     if (temps[temp].prev_copy == temps[temp].next_copy) {
>         temps[temps[temp].next_copy].is_copy = false;
>     } else {
>         temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
>         temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
>     }
> 
> would be replaced simply by
> 
>     temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
>     temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
> 

That's an interesting idea, especially I have a patch series in
preparation that get rid of is_const. I will try to get something like
that for v2.
Alex Bennée July 29, 2015, 4:10 p.m. UTC | #3
Aurelien Jarno <aurelien@aurel32.net> writes:

> Use two bools to track constants and copies instead of an enum.

More of an explanation would be useful as to why, otherwise it seems to
me we are just increasing the size of the structure (assuming the
compiler uses the same base sizes for the bool and enum).


>
> Cc: Richard Henderson <rth@twiddle.net>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>  tcg/optimize.c | 30 +++++++++++++++---------------
>  1 file changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/tcg/optimize.c b/tcg/optimize.c
> index d2b63a4..f16eb1e 100644
> --- a/tcg/optimize.c
> +++ b/tcg/optimize.c
> @@ -35,14 +35,9 @@
>          glue(glue(case INDEX_op_, x), _i32):    \
>          glue(glue(case INDEX_op_, x), _i64)
>  
> -typedef enum {
> -    TCG_TEMP_UNDEF = 0,
> -    TCG_TEMP_CONST,
> -    TCG_TEMP_COPY,
> -} tcg_temp_state;
> -
>  struct tcg_temp_info {
> -    tcg_temp_state state;
> +    bool is_const;
> +    bool is_copy;
>      uint16_t prev_copy;
>      uint16_t next_copy;
>      tcg_target_ulong val;
> @@ -54,12 +49,12 @@ static TCGTempSet temps_used;
>  
>  static inline bool temp_is_const(TCGArg arg)
>  {
> -    return temps[arg].state == TCG_TEMP_CONST;
> +    return temps[arg].is_const;
>  }
>  
>  static inline bool temp_is_copy(TCGArg arg)
>  {
> -    return temps[arg].state == TCG_TEMP_COPY;
> +    return temps[arg].is_copy;
>  }
>  
>  /* Reset TEMP's state to TCG_TEMP_UNDEF.  If TEMP only had one copy, remove
> @@ -68,13 +63,14 @@ static void reset_temp(TCGArg temp)
>  {
>      if (temp_is_copy(temp)) {
>          if (temps[temp].prev_copy == temps[temp].next_copy) {
> -            temps[temps[temp].next_copy].state = TCG_TEMP_UNDEF;
> +            temps[temps[temp].next_copy].is_copy = false;
>          } else {
>              temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
>              temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
>          }
>      }
> -    temps[temp].state = TCG_TEMP_UNDEF;
> +    temps[temp].is_const = false;
> +    temps[temp].is_copy = false;
>      temps[temp].mask = -1;
>  }
>  
> @@ -88,7 +84,8 @@ static void reset_all_temps(int nb_temps)
>  static void init_temp_info(TCGArg temp)
>  {
>      if (!test_bit(temp, temps_used.l)) {
> -        temps[temp].state = TCG_TEMP_UNDEF;
> +        temps[temp].is_const = false;
> +        temps[temp].is_copy = false;
>          temps[temp].mask = -1;
>          set_bit(temp, temps_used.l);
>      }
> @@ -218,7 +215,8 @@ static void tcg_opt_gen_movi(TCGContext *s, TCGOp *op, TCGArg *args,
>      op->opc = new_op;
>  
>      reset_temp(dst);
> -    temps[dst].state = TCG_TEMP_CONST;
> +    temps[dst].is_const = true;
> +    temps[dst].is_copy = false;
>      temps[dst].val = val;
>      mask = val;
>      if (TCG_TARGET_REG_BITS > 32 && new_op == INDEX_op_movi_i32) {
> @@ -261,11 +259,13 @@ static void tcg_opt_gen_mov(TCGContext *s, TCGOp *op, TCGArg *args,
>  
>      if (s->temps[src].type == s->temps[dst].type) {
>          if (!temp_is_copy(src)) {
> -            temps[src].state = TCG_TEMP_COPY;
> +            temps[src].is_const = false;
> +            temps[src].is_copy = true;
>              temps[src].next_copy = src;
>              temps[src].prev_copy = src;
>          }
> -        temps[dst].state = TCG_TEMP_COPY;
> +        temps[dst].is_const = false;
> +        temps[dst].is_copy = true;
>          temps[dst].next_copy = temps[src].next_copy;
>          temps[dst].prev_copy = src;
>          temps[temps[dst].next_copy].prev_copy = dst;
Aurelien Jarno July 29, 2015, 4:25 p.m. UTC | #4
On 2015-07-29 17:10, Alex Bennée wrote:
> 
> Aurelien Jarno <aurelien@aurel32.net> writes:
> 
> > Use two bools to track constants and copies instead of an enum.
> 
> More of an explanation would be useful as to why, otherwise it seems to
> me we are just increasing the size of the structure (assuming the
> compiler uses the same base sizes for the bool and enum).

The reason is in the following patch, to allow separate tracking of const
and copy. Note that this doesn't increase the structure size due to
alignment and that the v2 of this patchset actually uses only one bool.

I'll add a note about why it is need for v3.
diff mbox

Patch

diff --git a/tcg/optimize.c b/tcg/optimize.c
index d2b63a4..f16eb1e 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -35,14 +35,9 @@ 
         glue(glue(case INDEX_op_, x), _i32):    \
         glue(glue(case INDEX_op_, x), _i64)
 
-typedef enum {
-    TCG_TEMP_UNDEF = 0,
-    TCG_TEMP_CONST,
-    TCG_TEMP_COPY,
-} tcg_temp_state;
-
 struct tcg_temp_info {
-    tcg_temp_state state;
+    bool is_const;
+    bool is_copy;
     uint16_t prev_copy;
     uint16_t next_copy;
     tcg_target_ulong val;
@@ -54,12 +49,12 @@  static TCGTempSet temps_used;
 
 static inline bool temp_is_const(TCGArg arg)
 {
-    return temps[arg].state == TCG_TEMP_CONST;
+    return temps[arg].is_const;
 }
 
 static inline bool temp_is_copy(TCGArg arg)
 {
-    return temps[arg].state == TCG_TEMP_COPY;
+    return temps[arg].is_copy;
 }
 
 /* Reset TEMP's state to TCG_TEMP_UNDEF.  If TEMP only had one copy, remove
@@ -68,13 +63,14 @@  static void reset_temp(TCGArg temp)
 {
     if (temp_is_copy(temp)) {
         if (temps[temp].prev_copy == temps[temp].next_copy) {
-            temps[temps[temp].next_copy].state = TCG_TEMP_UNDEF;
+            temps[temps[temp].next_copy].is_copy = false;
         } else {
             temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
             temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
         }
     }
-    temps[temp].state = TCG_TEMP_UNDEF;
+    temps[temp].is_const = false;
+    temps[temp].is_copy = false;
     temps[temp].mask = -1;
 }
 
@@ -88,7 +84,8 @@  static void reset_all_temps(int nb_temps)
 static void init_temp_info(TCGArg temp)
 {
     if (!test_bit(temp, temps_used.l)) {
-        temps[temp].state = TCG_TEMP_UNDEF;
+        temps[temp].is_const = false;
+        temps[temp].is_copy = false;
         temps[temp].mask = -1;
         set_bit(temp, temps_used.l);
     }
@@ -218,7 +215,8 @@  static void tcg_opt_gen_movi(TCGContext *s, TCGOp *op, TCGArg *args,
     op->opc = new_op;
 
     reset_temp(dst);
-    temps[dst].state = TCG_TEMP_CONST;
+    temps[dst].is_const = true;
+    temps[dst].is_copy = false;
     temps[dst].val = val;
     mask = val;
     if (TCG_TARGET_REG_BITS > 32 && new_op == INDEX_op_movi_i32) {
@@ -261,11 +259,13 @@  static void tcg_opt_gen_mov(TCGContext *s, TCGOp *op, TCGArg *args,
 
     if (s->temps[src].type == s->temps[dst].type) {
         if (!temp_is_copy(src)) {
-            temps[src].state = TCG_TEMP_COPY;
+            temps[src].is_const = false;
+            temps[src].is_copy = true;
             temps[src].next_copy = src;
             temps[src].prev_copy = src;
         }
-        temps[dst].state = TCG_TEMP_COPY;
+        temps[dst].is_const = false;
+        temps[dst].is_copy = true;
         temps[dst].next_copy = temps[src].next_copy;
         temps[dst].prev_copy = src;
         temps[temps[dst].next_copy].prev_copy = dst;