diff options
| author | Richard Henderson <richard.henderson@linaro.org> | 2020-11-03 13:20:21 -0800 |
|---|---|---|
| committer | Richard Henderson <richard.henderson@linaro.org> | 2020-11-04 10:35:40 -0800 |
| commit | c56caea3b2a4ef5d760266f554df0d92c5a45f87 (patch) | |
| tree | 80fba4ec72139128960a1bbe052dc8432c0d8e83 /tcg/optimize.c | |
| parent | f14bed3fd4a17e1255e2ed6db1dfe50e654e601d (diff) | |
| download | focaccia-qemu-c56caea3b2a4ef5d760266f554df0d92c5a45f87.tar.gz focaccia-qemu-c56caea3b2a4ef5d760266f554df0d92c5a45f87.zip | |
tcg: Revert "tcg/optimize: Flush data at labels not TCG_OPF_BB_END"
This reverts commit cd0372c515c4732d8bd3777cdd995c139c7ed7ea. The patch is incorrect in that it retains copies between globals and non-local temps, and non-local temps still die at the end of the BB. Failing test case for hppa: .globl _start _start: cmpiclr,= 0x24,%r19,%r0 cmpiclr,<> 0x2f,%r19,%r19 ---- 00010057 0001005b movi_i32 tmp0,$0x24 sub_i32 tmp1,tmp0,r19 mov_i32 tmp2,tmp0 mov_i32 tmp3,r19 movi_i32 tmp1,$0x0 ---- 0001005b 0001005f brcond_i32 tmp2,tmp3,eq,$L1 movi_i32 tmp0,$0x2f sub_i32 tmp1,tmp0,r19 mov_i32 tmp2,tmp0 mov_i32 tmp3,r19 movi_i32 tmp1,$0x0 mov_i32 r19,tmp1 setcond_i32 psw_n,tmp2,tmp3,ne set_label $L1 In this case, both copies of "mov_i32 tmp3,r19" are removed. The second because opt thought it was redundant. The first is removed later by liveness because tmp3 is known to be dead. This leaves the setcond_i32 with an uninitialized input. Revert the entire patch for 5.2, and a proper optimization across the branch may be considered for the next development cycle. Reported-by: qemu@igor2.repo.hu Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'tcg/optimize.c')
| -rw-r--r-- | tcg/optimize.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/tcg/optimize.c b/tcg/optimize.c index 9952c28bdc..220f4601d5 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -1484,30 +1484,29 @@ void tcg_optimize(TCGContext *s) } } } - /* fall through */ + goto do_reset_output; default: do_default: - /* - * 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; + /* 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; + } } } 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. */ |