[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 10/12] tcg: Improve move ops in liveness_pass_2
From: |
Richard Henderson |
Subject: |
[PULL 10/12] tcg: Improve move ops in liveness_pass_2 |
Date: |
Tue, 2 Jun 2020 10:01:49 -0700 |
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>
---
tcg/tcg.c | 78 +++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 56 insertions(+), 22 deletions(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 97558ec068..1aa6cb47f2 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -2982,34 +2982,68 @@ static bool liveness_pass_2(TCGContext *s)
}
/* Outputs become available. */
- for (i = 0; i < nb_oargs; i++) {
- arg_ts = arg_temp(op->args[i]);
+ 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) {
- continue;
+ 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));
+ }
}
- op->args[i] = temp_arg(dir_ts);
- changes = true;
+ } else {
+ for (i = 0; i < nb_oargs; i++) {
+ arg_ts = arg_temp(op->args[i]);
+ dir_ts = arg_ts->state_ptr;
+ if (!dir_ts) {
+ continue;
+ }
+ op->args[i] = temp_arg(dir_ts);
+ changes = true;
- /* The output is now live and modified. */
- arg_ts->state = 0;
+ /* The output is now live and modified. */
+ arg_ts->state = 0;
- /* Sync outputs upon their last write. */
- if (NEED_SYNC_ARG(i)) {
- 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);
+ /* Sync outputs upon their last write. */
+ if (NEED_SYNC_ARG(i)) {
+ 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);
- sop->args[0] = temp_arg(dir_ts);
- sop->args[1] = temp_arg(arg_ts->mem_base);
- sop->args[2] = arg_ts->mem_offset;
+ sop->args[0] = temp_arg(dir_ts);
+ sop->args[1] = temp_arg(arg_ts->mem_base);
+ sop->args[2] = arg_ts->mem_offset;
- arg_ts->state = TS_MEM;
- }
- /* Drop outputs that are dead. */
- if (IS_DEAD_ARG(i)) {
- arg_ts->state = TS_DEAD;
+ arg_ts->state = TS_MEM;
+ }
+ /* Drop outputs that are dead. */
+ if (IS_DEAD_ARG(i)) {
+ arg_ts->state = TS_DEAD;
+ }
}
}
}
--
2.25.1
- [PULL 00/12] tcg patch queue, Richard Henderson, 2020/06/02
- [PULL 01/12] tcg: Implement gvec support for rotate by immediate, Richard Henderson, 2020/06/02
- [PULL 02/12] tcg: Implement gvec support for rotate by vector, Richard Henderson, 2020/06/02
- [PULL 03/12] tcg: Remove expansion to shift by vector from do_shifts, Richard Henderson, 2020/06/02
- [PULL 04/12] tcg: Implement gvec support for rotate by scalar, Richard Henderson, 2020/06/02
- [PULL 05/12] tcg/i386: Implement INDEX_op_rotl{i,s,v}_vec, Richard Henderson, 2020/06/02
- [PULL 06/12] tcg/aarch64: Implement INDEX_op_rotl{i,v}_vec, Richard Henderson, 2020/06/02
- [PULL 07/12] tcg/ppc: Implement INDEX_op_rot[lr]v_vec, Richard Henderson, 2020/06/02
- [PULL 08/12] target/ppc: Use tcg_gen_gvec_rotlv, Richard Henderson, 2020/06/02
- [PULL 10/12] tcg: Improve move ops in liveness_pass_2,
Richard Henderson <=
- [PULL 11/12] accel/tcg: Adjust cpu_signal_handler for NetBSD/arm, Richard Henderson, 2020/06/02
- [PULL 09/12] target/s390x: Use tcg_gen_gvec_rotl{i,s,v}, Richard Henderson, 2020/06/02
- [PULL 12/12] accel/tcg: Provide a NetBSD specific aarch64 cpu_signal_handler, Richard Henderson, 2020/06/02
- Re: [PULL 00/12] tcg patch queue, Peter Maydell, 2020/06/02