From patchwork Sat Aug 6 14:06:20 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Blue Swirl X-Patchwork-Id: 108773 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id AD807B6F81 for ; Sun, 7 Aug 2011 00:06:56 +1000 (EST) Received: from localhost ([::1]:42447 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QphWb-0006Co-1U for incoming@patchwork.ozlabs.org; Sat, 06 Aug 2011 10:06:49 -0400 Received: from eggs.gnu.org ([140.186.70.92]:40955) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QphWU-0006Ch-Iu for qemu-devel@nongnu.org; Sat, 06 Aug 2011 10:06:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QphWT-00023D-8G for qemu-devel@nongnu.org; Sat, 06 Aug 2011 10:06:42 -0400 Received: from mail-qw0-f45.google.com ([209.85.216.45]:36927) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QphWT-000239-0s for qemu-devel@nongnu.org; Sat, 06 Aug 2011 10:06:41 -0400 Received: by qwj8 with SMTP id 8so664120qwj.4 for ; Sat, 06 Aug 2011 07:06:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; bh=FNEWmuDBlSE5PADAmPTCbi5ekWcA6lS+gEl+uix6Y8A=; b=i/54oWS4vcPU1t4UqDgbBix5W7yoc3uO9+j8Jkn6k5ir+QZbtakHuZavjKn9KAX4cW TbORgoqzBTqbApLmg4JuDSkPQPTWLiTWfh8ZJoASB0UGp6Df0lw4LgjqQsv/wkNENSZL O9NDGCyuTOFa23aVMQLajUTvvrScOGEJNOipo= Received: by 10.224.71.69 with SMTP id g5mr2494183qaj.382.1312639600202; Sat, 06 Aug 2011 07:06:40 -0700 (PDT) MIME-Version: 1.0 Received: by 10.224.37.82 with HTTP; Sat, 6 Aug 2011 07:06:20 -0700 (PDT) From: Blue Swirl Date: Sat, 6 Aug 2011 14:06:20 +0000 Message-ID: To: Kirill Batuzov , zhur@ispras.ru, qemu-devel , Stefan Weil , TeLeMan X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.216.45 Subject: [Qemu-devel] [PATCH] TCG: fix copy propagation 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 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 --- tcg/optimize.c | 13 +++++++------ tcg/tcg.h | 5 +++++ 2 files changed, 12 insertions(+), 6 deletions(-) * code which is not supposed to leak any TCG temporaries, then From f8f16733f469eebae8f6132abc70e7357e41cf7f Mon Sep 17 00:00:00 2001 Message-Id: From: Blue Swirl Date: Sat, 6 Aug 2011 13:58:47 +0000 Subject: [PATCH] TCG: fix copy propagation 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 --- 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); if (temps[src].state != TCG_TEMP_HAS_COPY) { temps[src].state = TCG_TEMP_HAS_COPY; @@ -474,7 +475,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, gen_opc_buf[op_index] = INDEX_op_nop; } else { gen_opc_buf[op_index] = op_to_mov(op); - tcg_opt_gen_mov(gen_args, args[0], args[1], + tcg_opt_gen_mov(s, gen_args, args[0], args[1], nb_temps, nb_globals); gen_args += 2; args += 3; @@ -500,7 +501,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, gen_opc_buf[op_index] = INDEX_op_nop; } else { gen_opc_buf[op_index] = op_to_mov(op); - tcg_opt_gen_mov(gen_args, args[0], args[1], nb_temps, + tcg_opt_gen_mov(s, gen_args, args[0], args[1], nb_temps, nb_globals); gen_args += 2; args += 3; @@ -523,7 +524,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, break; } if (temps[args[1]].state != TCG_TEMP_CONST) { - tcg_opt_gen_mov(gen_args, args[0], args[1], + tcg_opt_gen_mov(s, gen_args, args[0], args[1], nb_temps, nb_globals); gen_args += 2; args += 2; diff --git a/tcg/tcg.h b/tcg/tcg.h index e76f9af..e2a7095 100644 --- a/tcg/tcg.h +++ b/tcg/tcg.h @@ -410,6 +410,11 @@ static inline TCGv_i64 tcg_temp_local_new_i64(void) void tcg_temp_free_i64(TCGv_i64 arg); char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg); +static inline bool tcg_arg_is_local(TCGContext *s, TCGArg arg) +{ + return s->temps[arg].temp_local; +} + #if defined(CONFIG_DEBUG_TCG) /* If you call tcg_clear_temp_count() at the start of a section of * code which is not supposed to leak any TCG temporaries, then -- 1.7.2.5