From patchwork Tue Oct 30 23:56:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aurelien Jarno X-Patchwork-Id: 195666 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 24DF92C009B for ; Wed, 31 Oct 2012 10:56:51 +1100 (EST) Received: from localhost ([::1]:57295 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TTLft-0006O3-5k for incoming@patchwork.ozlabs.org; Tue, 30 Oct 2012 19:56:49 -0400 Received: from eggs.gnu.org ([208.118.235.92]:37741) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TTLfm-0006Ny-Cz for qemu-devel@nongnu.org; Tue, 30 Oct 2012 19:56:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TTLfk-0004Oy-Tz for qemu-devel@nongnu.org; Tue, 30 Oct 2012 19:56:42 -0400 Received: from hall.aurel32.net ([88.191.126.93]:45354) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TTLfk-0004Oc-KM for qemu-devel@nongnu.org; Tue, 30 Oct 2012 19:56:40 -0400 Received: from aurel32 by hall.aurel32.net with local (Exim 4.72) (envelope-from ) id 1TTLfh-0001Hz-0C; Wed, 31 Oct 2012 00:56:37 +0100 Date: Wed, 31 Oct 2012 00:56:36 +0100 From: Aurelien Jarno To: Stefan Weil Message-ID: <20121030235636.GB32197@hall.aurel32.net> References: <508EC28A.5060706@redhat.com> <20121029182958.GB29866@ohm.aurel32.net> <508F8CBB.8090101@redhat.com> <509053A2.6010504@weilnetz.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <509053A2.6010504@weilnetz.de> X-Mailer: Mutt 1.5.20 (2009-06-14) User-Agent: Mutt/1.5.20 (2009-06-14) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 88.191.126.93 Cc: Paolo Bonzini , qemu-devel Subject: Re: [Qemu-devel] 64-on-32 TCG broken X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On Tue, Oct 30, 2012 at 11:24:34PM +0100, Stefan Weil wrote: > Am 30.10.2012 09:15, schrieb Paolo Bonzini: > >Il 29/10/2012 19:29, Aurelien Jarno ha scritto: > >>On Mon, Oct 29, 2012 at 06:53:14PM +0100, Paolo Bonzini wrote: > >>>>Known-good commit: 8473f377393219390ea6f2d8d450a2b054bb823e > >>>>Known-bad commit: d262cb02861dd33375c08fc798930653b14769e9 > >>>> > >>>>i386-softmmu seems to work. I may try to bisect it tomorrow, but I'd be > >>>>glad if somebody else beats me. It can be reproduced with Wine and > >>>>"x86_64-softmmu/qemu-system-x86_64.exe -L ../pc-bios"; it hangs at iPXE. > >>Oops, sorry about that. Is it win32 or win64? I'll try to fix it asap, > >>but right now I don't have a good network connection enough to either > >>setup a mingw build environment or to connect to a remote machine with > >>such an environment. > > > >It's win32, and the first bad commit is 9c43b68 (tcg: rework liveness > >analysis, 2012-10-09). But it looks like 64-on-32 emulation is more > >generally broken. I now tried x86_64-linux-user compiled for 32-bit, > >and it segfaults on startup. Even the previous commit cannot run > >qemu-x86_64 /bin/ls correctly: > > > > I just tested with latest qemu-system-x86_64 on 32 bit Linux. > > It also hangs during boot (BIOS), so it looks like this > is not a MinGW only problem. > > Your test with x86_64-linux-user indicates that, too. > > I also get the problem with TCI. Therefore I expect that any > 32 bit TCG target will show it. > It ended up to be a merge issue. The newly added special cases for half-dead operations also need to be changed with the liveness analysis rework. The attached patch fixes the issue on a 32-bit linux host. I haven't tried win32 yet, maybe someone will beat me. Tested-by: Stefan Weil From 8a99a0e875f2de8bf47e6fd27523723176251333 Mon Sep 17 00:00:00 2001 From: Aurelien Jarno Date: Wed, 31 Oct 2012 00:50:15 +0100 Subject: [PATCH] tcg: don't remove op if output needs to be synced to memory Commit 9c43b68de628a1e2cba556adfb71c17028eb802e do not correctly check for dead outputs when they need to be synced to memory in case of half-dead operations. Fix that by applying the same pattern than for the default case. Signed-off-by: Aurelien Jarno --- tcg/tcg.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tcg/tcg.c b/tcg/tcg.c index c3a7f19..1133438 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -1329,8 +1329,8 @@ static void tcg_liveness_analysis(TCGContext *s) the low part. The result can be optimized to a simple add or sub. This happens often for x86_64 guest when the cpu mode is set to 32 bit. */ - if (dead_temps[args[1]]) { - if (dead_temps[args[0]]) { + if (dead_temps[args[1]] && !mem_temps[1]) { + if (dead_temps[args[0]] && !mem_temps[0]) { goto do_remove; } /* Create the single operation plus nop. */ @@ -1355,8 +1355,8 @@ static void tcg_liveness_analysis(TCGContext *s) nb_iargs = 2; nb_oargs = 2; /* Likewise, test for the high part of the operation dead. */ - if (dead_temps[args[1]]) { - if (dead_temps[args[0]]) { + if (dead_temps[args[1]] && !mem_temps[1]) { + if (dead_temps[args[0]] && !mem_temps[0]) { goto do_remove; } gen_opc_buf[op_index] = op = INDEX_op_mul_i32; -- 1.7.2.5