From patchwork Mon Aug 17 19:38:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 508070 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 2AEA414032B for ; Tue, 18 Aug 2015 05:40:14 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=O0rTrL+Z; dkim-atps=neutral Received: from localhost ([::1]:55659 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZRQGS-0006Hr-3T for incoming@patchwork.ozlabs.org; Mon, 17 Aug 2015 15:40:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57358) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZRQFp-0005xh-NY for qemu-devel@nongnu.org; Mon, 17 Aug 2015 15:39:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZRQFm-0008HV-Pz for qemu-devel@nongnu.org; Mon, 17 Aug 2015 15:39:33 -0400 Received: from mail-qk0-x22b.google.com ([2607:f8b0:400d:c09::22b]:33854) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZRQFm-0008HR-M1 for qemu-devel@nongnu.org; Mon, 17 Aug 2015 15:39:30 -0400 Received: by qkcs67 with SMTP id s67so50545418qkc.1 for ; Mon, 17 Aug 2015 12:39:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=lnoElLWmzfoP2B8j+4d3d3Pqp0/AnyMMoetiKn9Nwa4=; b=O0rTrL+Z8Z1HpCtyn7wZi/5eF+GRIzffdBJRAMunI+dLZP1jNRY2QvIXNR4wa8xXrx im4My2m88kJBZX/XIqzrXh+XOJHpODJKSOCB0sTPYcnXzcc5eXK6etzZ/9jYnpjmJw53 mz7po13p3gc491qlCD1jjmpBCefcZqcDYdqSNutPMNYjqkhQRaDzDX85S8VXDgMB7xRY PL3tsGJ1Qd3w3j0P4zGwxZKKpCu92P9ELUjEExw6I0LWDOfHYPoPSKW7bB/bJfGmTIuW gIAgNWWJ298VSE0wOx6x+e5e7ehktFWwDpgJYm49VkVfgG84aUY7Q9n3vKcC5iEfKNUg G8hg== X-Received: by 10.55.31.142 with SMTP id n14mr5645943qkh.42.1439840370380; Mon, 17 Aug 2015 12:39:30 -0700 (PDT) Received: from anchor.com (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by smtp.gmail.com with ESMTPSA id z101sm8772880qge.31.2015.08.17.12.39.29 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Aug 2015 12:39:30 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 17 Aug 2015 12:38:25 -0700 Message-Id: <1439840320-20897-3-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1439840320-20897-1-git-send-email-rth@twiddle.net> References: <1439840320-20897-1-git-send-email-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400d:c09::22b Cc: peter.maydell@linaro.org, Aurelien Jarno Subject: [Qemu-devel] [PATCH 02/17] tcg/optimize: optimize temps tracking 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 From: Aurelien Jarno The tcg_temp_info structure uses 24 bytes per temp. Now that we emulate vector registers on most guests, it's not uncommon to have more than 100 used temps. This means we have initialize more than 2kB at least twice per TB, often more when there is a few goto_tb. Instead used a TCGTempSet bit array to track which temps are in used in the current basic block. This means there are only around 16 bytes to initialize. This improves the boot time of a MIPS guest on an x86-64 host by around 7% and moves out tcg_optimize from the the top of the profiler list. Cc: Richard Henderson Signed-off-by: Aurelien Jarno --- tcg/optimize.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/tcg/optimize.c b/tcg/optimize.c index cd0e793..425c14b 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -50,6 +50,7 @@ struct tcg_temp_info { }; static struct tcg_temp_info temps[TCG_MAX_TEMPS]; +static TCGTempSet temps_used; /* Reset TEMP's state to TCG_TEMP_UNDEF. If TEMP only had one copy, remove the copy flag from the left temp. */ @@ -67,6 +68,22 @@ static void reset_temp(TCGArg temp) temps[temp].mask = -1; } +/* Reset all temporaries, given that there are NB_TEMPS of them. */ +static void reset_all_temps(int nb_temps) +{ + bitmap_zero(temps_used.l, nb_temps); +} + +/* Initialize and activate a temporary. */ +static void init_temp_info(TCGArg temp) +{ + if (!test_bit(temp, temps_used.l)) { + temps[temp].state = TCG_TEMP_UNDEF; + temps[temp].mask = -1; + set_bit(temp, temps_used.l); + } +} + static TCGOp *insert_op_before(TCGContext *s, TCGOp *old_op, TCGOpcode opc, int nargs) { @@ -98,16 +115,6 @@ static TCGOp *insert_op_before(TCGContext *s, TCGOp *old_op, return new_op; } -/* Reset all temporaries, given that there are NB_TEMPS of them. */ -static void reset_all_temps(int nb_temps) -{ - int i; - for (i = 0; i < nb_temps; i++) { - temps[i].state = TCG_TEMP_UNDEF; - temps[i].mask = -1; - } -} - static int op_bits(TCGOpcode op) { const TCGOpDef *def = &tcg_op_defs[op]; @@ -606,6 +613,11 @@ void tcg_optimize(TCGContext *s) nb_iargs = def->nb_iargs; } + /* Initialize the temps that are going to be used */ + for (i = 0; i < nb_oargs + nb_iargs; i++) { + init_temp_info(args[i]); + } + /* Do copy propagation */ for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) { if (temps[args[i]].state == TCG_TEMP_COPY) { @@ -1299,7 +1311,9 @@ void tcg_optimize(TCGContext *s) if (!(args[nb_oargs + nb_iargs + 1] & (TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_WRITE_GLOBALS))) { for (i = 0; i < nb_globals; i++) { - reset_temp(i); + if (test_bit(i, temps_used.l)) { + reset_temp(i); + } } } goto do_reset_output;