mirror of https://github.com/xemu-project/xemu.git
tcg/optimize: fix end of basic block detection
Commit e31b0a7c05
fixed copy propagation on
32-bit host by restricting the copy between different types. This was the
wrong fix.
The real problem is that the all temps states should be reset at the end
of a basic block. This was done by adding such operations in the switch,
but brcond2 was forgotten (that's why the crash was only observed on 32-bit
hosts).
Fix that by looking at the TCG_OPF_BB_END instead. We need to keep the case
for op_set_label as temps might be modified through another path.
Cc: Blue Swirl <blauwirbel@gmail.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
bd277fa196
commit
a255066039
|
@ -632,21 +632,17 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
|
|||
i--;
|
||||
}
|
||||
break;
|
||||
case INDEX_op_set_label:
|
||||
case INDEX_op_jmp:
|
||||
case INDEX_op_br:
|
||||
memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info));
|
||||
for (i = 0; i < def->nb_args; i++) {
|
||||
*gen_args = *args;
|
||||
args++;
|
||||
gen_args++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* Default case: we do know nothing about operation so no
|
||||
propagation is done. We only trash output args. */
|
||||
for (i = 0; i < def->nb_oargs; i++) {
|
||||
reset_temp(args[i], nb_temps, nb_globals);
|
||||
propagation is done. We trash everything if the operation
|
||||
is the end of a basic block, otherwise we only trash the
|
||||
output args. */
|
||||
if (def->flags & TCG_OPF_BB_END) {
|
||||
memset(temps, 0, nb_temps * sizeof(struct tcg_temp_info));
|
||||
} else {
|
||||
for (i = 0; i < def->nb_oargs; i++) {
|
||||
reset_temp(args[i], nb_temps, nb_globals);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < def->nb_args; i++) {
|
||||
gen_args[i] = args[i];
|
||||
|
|
Loading…
Reference in New Issue