Skip to content

Commit

Permalink
tcg: Remove opcodes instead of noping them out
Browse files Browse the repository at this point in the history
With the linked list scheme we need not leave nops in the stream
that we need to process later.

Reviewed-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
Signed-off-by: Richard Henderson <rth@twiddle.net>
  • Loading branch information
rth7680 committed Feb 13, 2015
1 parent c45cb8b commit 0c627cd
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 11 deletions.
14 changes: 7 additions & 7 deletions tcg/optimize.c
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,7 @@ static void tcg_constant_folding(TCGContext *s)
break;
do_mov3:
if (temps_are_copies(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]);
}
Expand Down Expand Up @@ -916,7 +916,7 @@ static void tcg_constant_folding(TCGContext *s)
if (affected == 0) {
assert(nb_oargs == 1);
if (temps_are_copies(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 {
Expand Down Expand Up @@ -948,7 +948,7 @@ static void tcg_constant_folding(TCGContext *s)
CASE_OP_32_64(and):
if (temps_are_copies(args[1], args[2])) {
if (temps_are_copies(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]);
}
Expand Down Expand Up @@ -979,7 +979,7 @@ static void tcg_constant_folding(TCGContext *s)
switch (opc) {
CASE_OP_32_64(mov):
if (temps_are_copies(args[0], args[1])) {
op->opc = INDEX_op_nop;
tcg_op_remove(s, op);
break;
}
if (temps[args[1]].state != TCG_TEMP_CONST) {
Expand Down Expand Up @@ -1074,7 +1074,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;
}
Expand All @@ -1084,7 +1084,7 @@ static void tcg_constant_folding(TCGContext *s)
tmp = do_constant_folding_cond(opc, args[1], args[2], args[5]);
if (tmp != 2) {
if (temps_are_copies(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);
Expand Down Expand Up @@ -1177,7 +1177,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
Expand Down
28 changes: 24 additions & 4 deletions tcg/tcg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1244,6 +1244,29 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDef *tdefs)
#endif
}

void tcg_op_remove(TCGContext *s, TCGOp *op)
{
int next = op->next;
int prev = op->prev;

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;
}

*op = (TCGOp){ .opc = INDEX_op_nop, .next = -1, .prev = -1 };

#ifdef CONFIG_PROFILER
s->del_op_count++;
#endif
}

#ifdef USE_LIVENESS_ANALYSIS
/* liveness analysis: end of function: all temps are dead, and globals
should be in memory. */
Expand Down Expand Up @@ -1466,10 +1489,7 @@ static void tcg_liveness_analysis(TCGContext *s)
}
}
do_remove:
op->opc = INDEX_op_nop;
#ifdef CONFIG_PROFILER
s->del_op_count++;
#endif
tcg_op_remove(s, op);
} else {
do_not_remove:
/* output args are dead */
Expand Down
1 change: 1 addition & 0 deletions tcg/tcg.h
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,7 @@ void tcg_add_target_add_op_defs(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);

/* only used for debugging purposes */
Expand Down

0 comments on commit 0c627cd

Please sign in to comment.