diff mbox

[v3,6/9] tcg: Fold life data into TCGOp

Message ID 1466740107-15042-7-git-send-email-rth@twiddle.net
State New
Headers show

Commit Message

Richard Henderson June 24, 2016, 3:48 a.m. UTC
Reduce the size of other bitfields to make room.
This reduces the cache footprint of compilation.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 tcg/tcg.c |  9 +++------
 tcg/tcg.h | 26 ++++++++++++++------------
 2 files changed, 17 insertions(+), 18 deletions(-)

Comments

Aurelien Jarno July 25, 2016, 2:07 p.m. UTC | #1
On 2016-06-23 20:48, Richard Henderson wrote:
> Reduce the size of other bitfields to make room.
> This reduces the cache footprint of compilation.
> 
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
>  tcg/tcg.c |  9 +++------
>  tcg/tcg.h | 26 ++++++++++++++------------
>  2 files changed, 17 insertions(+), 18 deletions(-)

This looks fine and goes in the right direction of having all the data
at the same location. In the long term it might be useful to have the
TCG stream and the associated data together to implement more agressive
optimisations.

Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
diff mbox

Patch

diff --git a/tcg/tcg.c b/tcg/tcg.c
index bb1efe2..c41640f 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1327,10 +1327,7 @@  static inline void tcg_la_bb_end(TCGContext *s, uint8_t *dead_temps,
 static void tcg_liveness_analysis(TCGContext *s)
 {
     uint8_t *dead_temps, *mem_temps;
-    int oi, oi_prev, nb_ops;
-
-    nb_ops = s->gen_next_op_idx;
-    s->op_arg_life = tcg_malloc(nb_ops * sizeof(TCGLifeData));
+    int oi, oi_prev;
 
     dead_temps = tcg_malloc(s->nb_temps);
     mem_temps = tcg_malloc(s->nb_temps);
@@ -1553,7 +1550,7 @@  static void tcg_liveness_analysis(TCGContext *s)
             }
             break;
         }
-        s->op_arg_life[oi] = arg_life;
+        op->life = arg_life;
     }
 }
 
@@ -2377,7 +2374,7 @@  int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
         TCGArg * const args = &s->gen_opparam_buf[op->args];
         TCGOpcode opc = op->opc;
         const TCGOpDef *def = &tcg_op_defs[opc];
-        TCGLifeData arg_life = s->op_arg_life[oi];
+        TCGLifeData arg_life = op->life;
 
         oi_next = op->next;
 #ifdef CONFIG_PROFILER
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 49b396d..2ff3ad2 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -513,25 +513,30 @@  typedef struct TCGTempSet {
 #define SYNC_ARG  1
 typedef uint16_t TCGLifeData;
 
+/* The layout here is designed to avoid crossing of a 32-bit boundary.
+   If we do so, gcc adds padding, expanding the size to 12.  */
 typedef struct TCGOp {
-    TCGOpcode opc   : 8;
+    TCGOpcode opc   : 8;        /*  8 */
+
+    /* Index of the prex/next op, or 0 for the end of the list.  */
+    unsigned prev   : 10;       /* 18 */
+    unsigned next   : 10;       /* 28 */
 
     /* The number of out and in parameter for a call.  */
-    unsigned callo  : 2;
-    unsigned calli  : 6;
+    unsigned calli  : 4;        /* 32 */
+    unsigned callo  : 2;        /* 34 */
 
     /* Index of the arguments for this op, or 0 for zero-operand ops.  */
-    unsigned args   : 16;
+    unsigned args   : 14;       /* 48 */
 
-    /* Index of the prex/next op, or 0 for the end of the list.  */
-    unsigned prev   : 16;
-    unsigned next   : 16;
+    /* Lifetime data of the operands.  */
+    unsigned life   : 16;       /* 64 */
 } TCGOp;
 
 /* Make sure operands fit in the bitfields above.  */
 QEMU_BUILD_BUG_ON(NB_OPS > (1 << 8));
-QEMU_BUILD_BUG_ON(OPC_BUF_SIZE > (1 << 16));
-QEMU_BUILD_BUG_ON(OPPARAM_BUF_SIZE > (1 << 16));
+QEMU_BUILD_BUG_ON(OPC_BUF_SIZE > (1 << 10));
+QEMU_BUILD_BUG_ON(OPPARAM_BUF_SIZE > (1 << 14));
 
 /* Make sure that we don't overflow 64 bits without noticing.  */
 QEMU_BUILD_BUG_ON(sizeof(TCGOp) > 8);
@@ -549,9 +554,6 @@  struct TCGContext {
     uint16_t *tb_jmp_insn_offset; /* tb->jmp_insn_offset if USE_DIRECT_JUMP */
     uintptr_t *tb_jmp_target_addr; /* tb->jmp_target_addr if !USE_DIRECT_JUMP */
 
-    /* liveness analysis */
-    TCGLifeData *op_arg_life;
-
     TCGRegSet reserved_regs;
     intptr_t current_frame_offset;
     intptr_t frame_start;