Skip to content

Commit

Permalink
tcg: Fold life data into TCGOp
Browse files Browse the repository at this point in the history
Reduce the size of other bitfields to make room.
This reduces the cache footprint of compilation.

Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
Signed-off-by: Richard Henderson <rth@twiddle.net>
  • Loading branch information
rth7680 committed Aug 5, 2016
1 parent dcb8e75 commit bee158c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 18 deletions.
9 changes: 3 additions & 6 deletions tcg/tcg.c
Expand Up @@ -1342,10 +1342,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);
Expand Down Expand Up @@ -1568,7 +1565,7 @@ static void tcg_liveness_analysis(TCGContext *s)
}
break;
}
s->op_arg_life[oi] = arg_life;
op->life = arg_life;
}
}
#else
Expand Down Expand Up @@ -2410,7 +2407,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
Expand Down
26 changes: 14 additions & 12 deletions tcg/tcg.h
Expand Up @@ -583,25 +583,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 prev/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 prev/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);
Expand All @@ -619,9 +624,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;
Expand Down

0 comments on commit bee158c

Please sign in to comment.