qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] TCG: fix copy propagation


From: Stefan Weil
Subject: Re: [Qemu-devel] [PATCH] TCG: fix copy propagation
Date: Sat, 06 Aug 2011 22:33:54 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20110702 Iceowl/1.0b1 Icedove/3.0.11

Am 06.08.2011 22:13, schrieb Stefan Weil:
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 <address@hidden>
---
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

The patch works with qemu-system-mips64(el) after a small modification:

if (src >= nb_globals &&
    tcg_arg_is_local(s, src) && tcg_arg_is_local(s, dst)) {

Cheers,
Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]