From patchwork Mon Jul 27 10:56:07 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aurelien Jarno X-Patchwork-Id: 500332 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6625A1402E8 for ; Mon, 27 Jul 2015 20:57:04 +1000 (AEST) Received: from localhost ([::1]:52658 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZJg5e-00039F-CU for incoming@patchwork.ozlabs.org; Mon, 27 Jul 2015 06:57:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38963) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZJg4y-00022n-EL for qemu-devel@nongnu.org; Mon, 27 Jul 2015 06:56:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZJg4v-0005ee-FN for qemu-devel@nongnu.org; Mon, 27 Jul 2015 06:56:20 -0400 Received: from hall.aurel32.net ([2001:bc8:30d7:100::1]:42635) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZJg4v-0005dG-8z for qemu-devel@nongnu.org; Mon, 27 Jul 2015 06:56:17 -0400 Received: from weber.rr44.fr ([2001:bc8:30d7:120:7e05:7ff:fe0d:f152]) by hall.aurel32.net with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84) (envelope-from ) id 1ZJg4t-0005HA-DN; Mon, 27 Jul 2015 12:56:15 +0200 Received: from aurel32 by weber.rr44.fr with local (Exim 4.85) (envelope-from ) id 1ZJg4s-00023w-Fg; Mon, 27 Jul 2015 12:56:14 +0200 From: Aurelien Jarno To: qemu-devel@nongnu.org Date: Mon, 27 Jul 2015 12:56:07 +0200 Message-Id: <1437994568-7825-12-git-send-email-aurelien@aurel32.net> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1437994568-7825-1-git-send-email-aurelien@aurel32.net> References: <1437994568-7825-1-git-send-email-aurelien@aurel32.net> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:bc8:30d7:100::1 Cc: Paolo Bonzini , Aurelien Jarno , Richard Henderson Subject: [Qemu-devel] [PATCH v2 for-2.5 11/12] tcg/optimize: do not remember garbage high bits for 32-bit ops 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 Now that we have real size changing ops, we don't need to mark high bits of the destination as garbage. The goal of the optimizer is to predict the value of the temps (and not of the registers) and do simplifications when possible. The problem there is therefore not the fact that those bits are not counted as garbage, but that a size changing op is replaced by a move. This patch is basically a revert of 24666baf, including the changes that have been made since then. Cc: Richard Henderson Signed-off-by: Aurelien Jarno --- tcg/optimize.c | 41 +++++++++++------------------------------ 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/tcg/optimize.c b/tcg/optimize.c index 8f33755..166074e 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -203,20 +203,12 @@ static bool temps_are_copies(TCGArg arg1, TCGArg arg2) static void tcg_opt_gen_movi(TCGContext *s, TCGOp *op, TCGArg *args, TCGArg dst, TCGArg val) { - TCGOpcode new_op = op_to_movi(op->opc); - tcg_target_ulong mask; - - op->opc = new_op; + op->opc = op_to_movi(op->opc); reset_temp(dst); temps[dst].is_const = true; temps[dst].val = val; - mask = val; - if (TCG_TARGET_REG_BITS > 32 && new_op == INDEX_op_movi_i32) { - /* High bits of the destination are now garbage. */ - mask |= ~0xffffffffull; - } - temps[dst].mask = mask; + temps[dst].mask = val; args[0] = dst; args[1] = val; @@ -230,28 +222,21 @@ static void tcg_opt_gen_mov(TCGContext *s, TCGOp *op, TCGArg *args, return; } - TCGOpcode new_op = op_to_mov(op->opc); - tcg_target_ulong mask; - - op->opc = new_op; + op->opc = op_to_mov(op->opc); reset_temp(dst); - mask = temps[src].mask; - if (TCG_TARGET_REG_BITS > 32 && new_op == INDEX_op_mov_i32) { - /* High bits of the destination are now garbage. */ - mask |= ~0xffffffffull; - } - temps[dst].mask = mask; if (s->temps[src].type == s->temps[dst].type) { temps[dst].next_copy = temps[src].next_copy; temps[dst].prev_copy = src; temps[temps[dst].next_copy].prev_copy = dst; temps[src].next_copy = dst; - temps[dst].is_const = temps[src].is_const; - temps[dst].val = temps[src].val; } + temps[dst].is_const = temps[src].is_const; + temps[dst].val = temps[src].val; + temps[dst].mask = temps[src].mask; + args[0] = dst; args[1] = src; } @@ -584,7 +569,7 @@ void tcg_optimize(TCGContext *s) reset_all_temps(nb_temps); for (oi = s->gen_first_op_idx; oi >= 0; oi = oi_next) { - tcg_target_ulong mask, partmask, affected; + tcg_target_ulong mask, affected; int nb_oargs, nb_iargs, i; TCGArg tmp; @@ -937,17 +922,13 @@ void tcg_optimize(TCGContext *s) break; } - /* 32-bit ops generate 32-bit results. For the result is zero test - below, we can ignore high bits, but for further optimizations we - need to record that the high bits contain garbage. */ - partmask = mask; + /* 32-bit ops generate 32-bit results. */ if (!(def->flags & TCG_OPF_64BIT)) { - mask |= ~(tcg_target_ulong)0xffffffffu; - partmask &= 0xffffffffu; + mask &= 0xffffffffu; affected &= 0xffffffffu; } - if (partmask == 0) { + if (mask == 0) { assert(nb_oargs == 1); tcg_opt_gen_movi(s, op, args, args[0], 0); continue;