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. Cc: Richard Henderson <[email protected]> Signed-off-by: Aurelien Jarno <[email protected]> --- tcg/tcg.c | 3 +++ 1 file changed, 3 insertions(+) NB: The dead computation loop for call has the same problem, but it will not improve the generated code as anyway the value has to be copied to a register or memory. I am therefore not sure it is worth fixing it as it might bring some performance penalty. diff --git a/tcg/tcg.c b/tcg/tcg.c index f1558b7..58ca693 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -1522,6 +1522,9 @@ static void tcg_liveness_analysis(TCGContext *s) if (dead_temps[arg]) { dead_args |= (1 << i); } + } + 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.1.4
