mirror of https://github.com/xemu-project/xemu.git
tcg: Improve move ops in liveness_pass_2
If the output of the move is dead, then the last use is in the store. If we propagate the input to the store, then we can remove the move opcode entirely. Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
cea94ba36d
commit
61f15c487f
34
tcg/tcg.c
34
tcg/tcg.c
|
@ -2982,6 +2982,39 @@ static bool liveness_pass_2(TCGContext *s)
|
|||
}
|
||||
|
||||
/* Outputs become available. */
|
||||
if (opc == INDEX_op_mov_i32 || opc == INDEX_op_mov_i64) {
|
||||
arg_ts = arg_temp(op->args[0]);
|
||||
dir_ts = arg_ts->state_ptr;
|
||||
if (dir_ts) {
|
||||
op->args[0] = temp_arg(dir_ts);
|
||||
changes = true;
|
||||
|
||||
/* The output is now live and modified. */
|
||||
arg_ts->state = 0;
|
||||
|
||||
if (NEED_SYNC_ARG(0)) {
|
||||
TCGOpcode sopc = (arg_ts->type == TCG_TYPE_I32
|
||||
? INDEX_op_st_i32
|
||||
: INDEX_op_st_i64);
|
||||
TCGOp *sop = tcg_op_insert_after(s, op, sopc);
|
||||
TCGTemp *out_ts = dir_ts;
|
||||
|
||||
if (IS_DEAD_ARG(0)) {
|
||||
out_ts = arg_temp(op->args[1]);
|
||||
arg_ts->state = TS_DEAD;
|
||||
tcg_op_remove(s, op);
|
||||
} else {
|
||||
arg_ts->state = TS_MEM;
|
||||
}
|
||||
|
||||
sop->args[0] = temp_arg(out_ts);
|
||||
sop->args[1] = temp_arg(arg_ts->mem_base);
|
||||
sop->args[2] = arg_ts->mem_offset;
|
||||
} else {
|
||||
tcg_debug_assert(!IS_DEAD_ARG(0));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < nb_oargs; i++) {
|
||||
arg_ts = arg_temp(op->args[i]);
|
||||
dir_ts = arg_ts->state_ptr;
|
||||
|
@ -3013,6 +3046,7 @@ static bool liveness_pass_2(TCGContext *s)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue