tcg/optimize: Flush data at labels not TCG_OPF_BB_END

We can easily propagate temp values through the entire extended
basic block (in this case, the set of blocks connected by fallthru),
simply by not discarding the register state at the branch.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2020-10-09 08:23:52 -05:00
parent b4cb76e620
commit cd0372c515

View File

@ -1484,29 +1484,30 @@ void tcg_optimize(TCGContext *s)
}
}
}
goto do_reset_output;
/* fall through */
default:
do_default:
/* Default case: we know nothing about operation (or were unable
to compute the operation result) so no propagation is done.
We trash everything if the operation is the end of a basic
block, otherwise we only trash the output args. "mask" is
the non-zero bits mask for the first output arg. */
if (def->flags & TCG_OPF_BB_END) {
bitmap_zero(temps_used.l, nb_temps);
} else {
do_reset_output:
for (i = 0; i < nb_oargs; i++) {
reset_temp(op->args[i]);
/* Save the corresponding known-zero bits mask for the
first output argument (only one supported so far). */
if (i == 0) {
arg_info(op->args[i])->mask = mask;
}
/*
* Default case: we know nothing about operation (or were unable
* to compute the operation result) so no propagation is done.
*/
for (i = 0; i < nb_oargs; i++) {
reset_temp(op->args[i]);
/*
* Save the corresponding known-zero bits mask for the
* first output argument (only one supported so far).
*/
if (i == 0) {
arg_info(op->args[i])->mask = mask;
}
}
break;
case INDEX_op_set_label:
/* Trash everything at the start of a new extended bb. */
bitmap_zero(temps_used.l, nb_temps);
break;
}
/* Eliminate duplicate and redundant fence instructions. */