tcg: Remove opcodes instead of noping them out

With the linked list scheme we need not leave nops in the stream
that we need to process later.

Backports commit 0c627cdca20155753a536c51385abb73941a59a0 from qemu
This commit is contained in:
Richard Henderson 2018-02-09 13:03:25 -05:00 committed by Lioncash
parent 0273e6ae18
commit 4fcaabf38c
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
17 changed files with 49 additions and 7 deletions

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_aarch64
#define tcg_malloc_internal tcg_malloc_internal_aarch64
#define tcg_op_defs_org tcg_op_defs_org_aarch64
#define tcg_op_remove tcg_op_remove_aarch64
#define tcg_opt_gen_mov tcg_opt_gen_mov_aarch64
#define tcg_opt_gen_movi tcg_opt_gen_movi_aarch64
#define tcg_optimize tcg_optimize_aarch64

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_aarch64eb
#define tcg_malloc_internal tcg_malloc_internal_aarch64eb
#define tcg_op_defs_org tcg_op_defs_org_aarch64eb
#define tcg_op_remove tcg_op_remove_aarch64eb
#define tcg_opt_gen_mov tcg_opt_gen_mov_aarch64eb
#define tcg_opt_gen_movi tcg_opt_gen_movi_aarch64eb
#define tcg_optimize tcg_optimize_aarch64eb

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_arm
#define tcg_malloc_internal tcg_malloc_internal_arm
#define tcg_op_defs_org tcg_op_defs_org_arm
#define tcg_op_remove tcg_op_remove_arm
#define tcg_opt_gen_mov tcg_opt_gen_mov_arm
#define tcg_opt_gen_movi tcg_opt_gen_movi_arm
#define tcg_optimize tcg_optimize_arm

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_armeb
#define tcg_malloc_internal tcg_malloc_internal_armeb
#define tcg_op_defs_org tcg_op_defs_org_armeb
#define tcg_op_remove tcg_op_remove_armeb
#define tcg_opt_gen_mov tcg_opt_gen_mov_armeb
#define tcg_opt_gen_movi tcg_opt_gen_movi_armeb
#define tcg_optimize tcg_optimize_armeb

View file

@ -2876,6 +2876,7 @@ symbols = (
'tcg_malloc',
'tcg_malloc_internal',
'tcg_op_defs_org',
'tcg_op_remove',
'tcg_opt_gen_mov',
'tcg_opt_gen_movi',
'tcg_optimize',

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_m68k
#define tcg_malloc_internal tcg_malloc_internal_m68k
#define tcg_op_defs_org tcg_op_defs_org_m68k
#define tcg_op_remove tcg_op_remove_m68k
#define tcg_opt_gen_mov tcg_opt_gen_mov_m68k
#define tcg_opt_gen_movi tcg_opt_gen_movi_m68k
#define tcg_optimize tcg_optimize_m68k

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_mips
#define tcg_malloc_internal tcg_malloc_internal_mips
#define tcg_op_defs_org tcg_op_defs_org_mips
#define tcg_op_remove tcg_op_remove_mips
#define tcg_opt_gen_mov tcg_opt_gen_mov_mips
#define tcg_opt_gen_movi tcg_opt_gen_movi_mips
#define tcg_optimize tcg_optimize_mips

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_mips64
#define tcg_malloc_internal tcg_malloc_internal_mips64
#define tcg_op_defs_org tcg_op_defs_org_mips64
#define tcg_op_remove tcg_op_remove_mips64
#define tcg_opt_gen_mov tcg_opt_gen_mov_mips64
#define tcg_opt_gen_movi tcg_opt_gen_movi_mips64
#define tcg_optimize tcg_optimize_mips64

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_mips64el
#define tcg_malloc_internal tcg_malloc_internal_mips64el
#define tcg_op_defs_org tcg_op_defs_org_mips64el
#define tcg_op_remove tcg_op_remove_mips64el
#define tcg_opt_gen_mov tcg_opt_gen_mov_mips64el
#define tcg_opt_gen_movi tcg_opt_gen_movi_mips64el
#define tcg_optimize tcg_optimize_mips64el

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_mipsel
#define tcg_malloc_internal tcg_malloc_internal_mipsel
#define tcg_op_defs_org tcg_op_defs_org_mipsel
#define tcg_op_remove tcg_op_remove_mipsel
#define tcg_opt_gen_mov tcg_opt_gen_mov_mipsel
#define tcg_opt_gen_movi tcg_opt_gen_movi_mipsel
#define tcg_optimize tcg_optimize_mipsel

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_powerpc
#define tcg_malloc_internal tcg_malloc_internal_powerpc
#define tcg_op_defs_org tcg_op_defs_org_powerpc
#define tcg_op_remove tcg_op_remove_powerpc
#define tcg_opt_gen_mov tcg_opt_gen_mov_powerpc
#define tcg_opt_gen_movi tcg_opt_gen_movi_powerpc
#define tcg_optimize tcg_optimize_powerpc

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_sparc
#define tcg_malloc_internal tcg_malloc_internal_sparc
#define tcg_op_defs_org tcg_op_defs_org_sparc
#define tcg_op_remove tcg_op_remove_sparc
#define tcg_opt_gen_mov tcg_opt_gen_mov_sparc
#define tcg_opt_gen_movi tcg_opt_gen_movi_sparc
#define tcg_optimize tcg_optimize_sparc

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_sparc64
#define tcg_malloc_internal tcg_malloc_internal_sparc64
#define tcg_op_defs_org tcg_op_defs_org_sparc64
#define tcg_op_remove tcg_op_remove_sparc64
#define tcg_opt_gen_mov tcg_opt_gen_mov_sparc64
#define tcg_opt_gen_movi tcg_opt_gen_movi_sparc64
#define tcg_optimize tcg_optimize_sparc64

View file

@ -759,7 +759,7 @@ static void tcg_constant_folding(TCGContext *s)
break;
do_mov3:
if (temps_are_copies(s, args[0], args[1])) {
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
} else {
tcg_opt_gen_mov(s, op, args, opc, args[0], args[1]);
}
@ -917,7 +917,7 @@ static void tcg_constant_folding(TCGContext *s)
if (affected == 0) {
assert(nb_oargs == 1);
if (temps_are_copies(s, args[0], args[1])) {
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
} else if (temps[args[1]].state != TCG_TEMP_CONST) {
tcg_opt_gen_mov(s, op, args, opc, args[0], args[1]);
} else {
@ -949,7 +949,7 @@ static void tcg_constant_folding(TCGContext *s)
CASE_OP_32_64(and):
if (temps_are_copies(s, args[1], args[2])) {
if (temps_are_copies(s, args[0], args[1])) {
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
} else {
tcg_opt_gen_mov(s, op, args, opc, args[0], args[1]);
}
@ -980,7 +980,7 @@ static void tcg_constant_folding(TCGContext *s)
switch (opc) {
CASE_OP_32_64(mov):
if (temps_are_copies(s, args[0], args[1])) {
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
break;
}
if (temps[args[1]].state != TCG_TEMP_CONST) {
@ -1075,7 +1075,7 @@ static void tcg_constant_folding(TCGContext *s)
op->opc = INDEX_op_br;
args[0] = args[3];
} else {
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
}
break;
}
@ -1085,7 +1085,7 @@ static void tcg_constant_folding(TCGContext *s)
tmp = do_constant_folding_cond(s, opc, args[1], args[2], args[5]);
if (tmp != 2) {
if (temps_are_copies(s, args[0], args[4-tmp])) {
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
} else if (temps[args[4-tmp]].state == TCG_TEMP_CONST) {
tcg_opt_gen_movi(s, op, args, opc,
args[0], temps[args[4-tmp]].val);
@ -1178,7 +1178,7 @@ static void tcg_constant_folding(TCGContext *s)
args[0] = args[5];
} else {
do_brcond_false:
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
}
} else if ((args[4] == TCG_COND_LT || args[4] == TCG_COND_GE)
&& temps[args[2]].state == TCG_TEMP_CONST

View file

@ -1286,6 +1286,33 @@ void tcg_add_target_add_op_defs(TCGContext *s, const TCGTargetOpDef *tdefs)
#endif
}
void tcg_op_remove(TCGContext *s, TCGOp *op)
{
int next = op->next;
int prev = op->prev;
TCGOp opp = {0};
if (next >= 0) {
s->gen_op_buf[next].prev = prev;
} else {
s->gen_last_op_idx = prev;
}
if (prev >= 0) {
s->gen_op_buf[prev].next = next;
} else {
s->gen_first_op_idx = next;
}
opp.opc = INDEX_op_nop;
opp.next = -1;
opp.prev = -1;
*op = opp;
#ifdef CONFIG_PROFILER
s->del_op_count++;
#endif
}
#ifdef USE_LIVENESS_ANALYSIS
/* liveness analysis: end of function: all temps are dead, and globals

View file

@ -866,6 +866,7 @@ void tcg_add_target_add_op_defs(TCGContext *s, const TCGTargetOpDef *tdefs);
void tcg_gen_callN(TCGContext *s, void *func,
TCGArg ret, int nargs, TCGArg *args);
void tcg_op_remove(TCGContext *s, TCGOp *op);
void tcg_optimize(TCGContext *s);
static inline void *tcg_malloc(TCGContext *s, int size)

View file

@ -2870,6 +2870,7 @@
#define tcg_malloc tcg_malloc_x86_64
#define tcg_malloc_internal tcg_malloc_internal_x86_64
#define tcg_op_defs_org tcg_op_defs_org_x86_64
#define tcg_op_remove tcg_op_remove_x86_64
#define tcg_opt_gen_mov tcg_opt_gen_mov_x86_64
#define tcg_opt_gen_movi tcg_opt_gen_movi_x86_64
#define tcg_optimize tcg_optimize_x86_64