mirror of https://github.com/xemu-project/xemu.git
tcg: Reset free_temps before tcg_optimize
When allocating new temps during tcg_optmize, do not re-use
any EBB temps that were used within the TB. We do not have
any idea what span of the TB in which the temp was live.
Introduce tcg_temp_ebb_reset_freed and use before tcg_optimize,
as well as replacing the equivalent in plugin_gen_inject and
tcg_func_start.
Cc: qemu-stable@nongnu.org
Fixes: fb04ab7ddd
("tcg/optimize: Lower TCG_COND_TST{EQ,NE} if unsupported")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2711
Reported-by: wannacu <wannacu2049@gmail.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
0e50741c28
commit
a8a8e54564
|
@ -275,7 +275,7 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
|
|||
* that might be live within the existing opcode stream.
|
||||
* The simplest solution is to release them all and create new.
|
||||
*/
|
||||
memset(tcg_ctx->free_temps, 0, sizeof(tcg_ctx->free_temps));
|
||||
tcg_temp_ebb_reset_freed(tcg_ctx);
|
||||
|
||||
QTAILQ_FOREACH_SAFE(op, &tcg_ctx->ops, link, next) {
|
||||
switch (op->opc) {
|
||||
|
|
|
@ -44,4 +44,10 @@ TCGv_i64 tcg_temp_ebb_new_i64(void);
|
|||
TCGv_ptr tcg_temp_ebb_new_ptr(void);
|
||||
TCGv_i128 tcg_temp_ebb_new_i128(void);
|
||||
|
||||
/* Forget all freed EBB temps, so that new allocations produce new temps. */
|
||||
static inline void tcg_temp_ebb_reset_freed(TCGContext *s)
|
||||
{
|
||||
memset(s->free_temps, 0, sizeof(s->free_temps));
|
||||
}
|
||||
|
||||
#endif /* TCG_TEMP_FREE_H */
|
||||
|
|
|
@ -1504,7 +1504,7 @@ void tcg_func_start(TCGContext *s)
|
|||
s->nb_temps = s->nb_globals;
|
||||
|
||||
/* No temps have been previously allocated for size or locality. */
|
||||
memset(s->free_temps, 0, sizeof(s->free_temps));
|
||||
tcg_temp_ebb_reset_freed(s);
|
||||
|
||||
/* No constant temps have been previously allocated. */
|
||||
for (int i = 0; i < TCG_TYPE_COUNT; ++i) {
|
||||
|
@ -6231,6 +6231,9 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Do not reuse any EBB that may be allocated within the TB. */
|
||||
tcg_temp_ebb_reset_freed(s);
|
||||
|
||||
tcg_optimize(s);
|
||||
|
||||
reachable_code_pass(s);
|
||||
|
|
Loading…
Reference in New Issue