mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
tcg: Revert "tcg/optimize: Flush data at labels not TCG_OPF_BB_END"
This reverts commit cd0372c515
.
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>
This commit is contained in:
parent
f14bed3fd4
commit
c56caea3b2
|
@ -1484,30 +1484,29 @@ void tcg_optimize(TCGContext *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* fall through */
|
goto do_reset_output;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
do_default:
|
do_default:
|
||||||
/*
|
/* Default case: we know nothing about operation (or were unable
|
||||||
* Default case: we know nothing about operation (or were unable
|
to compute the operation result) so no propagation is done.
|
||||||
* 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
|
||||||
for (i = 0; i < nb_oargs; i++) {
|
the non-zero bits mask for the first output arg. */
|
||||||
reset_temp(op->args[i]);
|
if (def->flags & TCG_OPF_BB_END) {
|
||||||
/*
|
bitmap_zero(temps_used.l, nb_temps);
|
||||||
* Save the corresponding known-zero bits mask for the
|
} else {
|
||||||
* first output argument (only one supported so far).
|
do_reset_output:
|
||||||
*/
|
for (i = 0; i < nb_oargs; i++) {
|
||||||
if (i == 0) {
|
reset_temp(op->args[i]);
|
||||||
arg_info(op->args[i])->mask = mask;
|
/* 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;
|
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. */
|
/* Eliminate duplicate and redundant fence instructions. */
|
||||||
|
|
Loading…
Reference in a new issue