Am 06.08.2011 16:06, schrieb Blue Swirl:
Copy propagation introduced in 22613af4a6d9602001e6d0e7b6d98aa40aa018dc
considered only global registers. However, register temps and stack
allocated locals must be handled differently because register temps
don't survive across brcond.

Fix by propagating only within same class of temps.

Signed-off-by: Blue Swirl <blauwir...@gmail.com>
---
tcg/optimize.c | 13 +++++++------
tcg/tcg.h | 5 +++++
2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/tcg/optimize.c b/tcg/optimize.c
index a3bfa5e..748ecf9 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -185,12 +185,13 @@ static int op_to_movi(int op)
}
}

-static void tcg_opt_gen_mov(TCGArg *gen_args, TCGArg dst, TCGArg src,
- int nb_temps, int nb_globals)
+static void tcg_opt_gen_mov(TCGContext *s, TCGArg *gen_args, TCGArg dst,
+ TCGArg src, int nb_temps, int nb_globals)
{
reset_temp(dst, nb_temps, nb_globals);
assert(temps[src].state != TCG_TEMP_COPY);
- if (src >= nb_globals) {
+ if (src >= nb_globals &&
+ tcg_arg_is_local(s, src) == tcg_arg_is_local(s, dst)) {
assert(temps[src].state != TCG_TEMP_CONST);
[snip]

Hi Blue,

your patch fixes qemu-system-x86_64 which now seems to work on 32 bit hosts, too.

qemu-system-mips64(el) still fail with the same abort. They work when I remove the
if block in tcg_opt_gen_mov.

The Debian kernel for qemu-system-mips64 which I used for the test is available on
http://qemu.weilnetz.de/mips64/.

I could not reproduce the crash with qemu-system-ppc64 - neither with nor without
your patch.

Kind regards,
Stefan




Reply via email to