[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 4/9] tcg: fix dead computation for repeated input arg
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PULL 4/9] tcg: fix dead computation for repeated input arguments |
Date: |
Tue, 9 Jun 2015 07:13:00 -0700 |
From: Aurelien Jarno <address@hidden>
When the same temp is used twice or more as an input argument to a TCG
instruction, the dead computation code doesn't recognize the second use
as a dead temp. This is because the temp is marked as live in the same
loop where dead inputs are checked.
The fix is to split the loop in two parts. This avoid emitting a move
and using a register for the movcond instruction when used as "move if
true" on x86-64. This might bring more improvements on RISC TCG targets
which don't have outputs aliased to inputs.
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: Aurelien Jarno <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Richard Henderson <address@hidden>
---
tcg/tcg.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 4a6eb26..7e088b1 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1387,16 +1387,20 @@ static void tcg_liveness_analysis(TCGContext *s)
memset(dead_temps, 1, s->nb_globals);
}
- /* input args are live */
+ /* record arguments that die in this helper */
for (i = nb_oargs; i < nb_iargs + nb_oargs; i++) {
arg = args[i];
if (arg != TCG_CALL_DUMMY_ARG) {
if (dead_temps[arg]) {
dead_args |= (1 << i);
}
- dead_temps[arg] = 0;
}
}
+ /* input arguments are live for preceeding opcodes */
+ for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
+ arg = args[i];
+ dead_temps[arg] = 0;
+ }
s->op_dead_args[oi] = dead_args;
s->op_sync_args[oi] = sync_args;
}
@@ -1531,12 +1535,16 @@ static void tcg_liveness_analysis(TCGContext *s)
memset(mem_temps, 1, s->nb_globals);
}
- /* input args are live */
+ /* record arguments that die in this opcode */
for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
arg = args[i];
if (dead_temps[arg]) {
dead_args |= (1 << i);
}
+ }
+ /* input arguments are live for preceeding opcodes */
+ for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
+ arg = args[i];
dead_temps[arg] = 0;
}
s->op_dead_args[oi] = dead_args;
--
2.4.2
- [Qemu-devel] [PULL 0/9] tcg patch queue, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 1/9] tcg: Mask TCGMemOp appropriately for indexing, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 2/9] tcg: Handle MO_AMASK in tcg_dump_ops, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 3/9] tcg: fix register allocation with two aliased dead inputs, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 4/9] tcg: fix dead computation for repeated input arguments,
Richard Henderson <=
- [Qemu-devel] [PULL 5/9] tcg/optimize: remove opc argument from tcg_opt_gen_movi, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 7/9] tcg/optimize: fold temp copies test in tcg_opt_gen_mov, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 6/9] tcg/optimize: remove opc argument from tcg_opt_gen_mov, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 9/9] tcg/optimize: rename tcg_constant_folding, Richard Henderson, 2015/06/09
- [Qemu-devel] [PULL 8/9] tcg/optimize: fold constant test in tcg_opt_gen_mov, Richard Henderson, 2015/06/09
- Re: [Qemu-devel] [PULL 0/9] tcg patch queue, Peter Maydell, 2015/06/09