From patchwork Wed May 27 13:56:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 477125 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 680B91400B7 for ; Thu, 28 May 2015 00:00:25 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=RfRhs7wE; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to; q=dns; s=default; b= GqZy15XQtP/fmb+jJp+REVzCNvbBdXR6mCZxOVuDHClLutLyb+c4Bk0M/XawrzjN vUXm7+dYj1TbZpMW4ZDKHbzY69zkzdv63gWFtWU8hbQ9CjHVWQpwKOP5kK2wlr4X XqJ9xsZ9tEWT4MHA1NBh/efndz+ZbJYLHCWqQG1LXgQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to; s=default; bh=tPyi Qa0hjRZlkpBBxvkt6PvmpPI=; b=RfRhs7wEZTkIv5Xoj4VjJPUX9M6Niz2CH9mO yP1w5IBAf0v5+X0Ld6XlEBIHtUnDX1gOAFKG+b1KfDldQAN+OvQR+juiqGfEhaOt SLnJoja/EBMIk/d4a/MxmDi4oUebWjn1TgCLApM5i8fbSuQvPq0JzUE3HcNO6eX4 6dMf9WQ= Received: (qmail 68792 invoked by alias); 27 May 2015 14:00:02 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 68688 invoked by uid 89); 27 May 2015 14:00:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.6 required=5.0 tests=AWL, BAYES_50, KAM_LAZY_DOMAIN_SECURITY autolearn=no version=3.3.2 X-HELO: mx2.suse.de Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Wed, 27 May 2015 13:59:59 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8DB44ADED for ; Wed, 27 May 2015 13:59:56 +0000 (UTC) Resent-From: =?UTF-8?B?TWFydGluIExpxaFrYQ==?= Resent-To: GCC Patches Resent-Date: Wed, 27 May 2015 15:59:56 +0200 Resent-Message-ID: <5565CDDC.8060406@suse.cz> Resent-User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 Message-Id: <82bb85c286a8c81abc4cfa654f77ca9ba617c0d4.1432735040.git.mliska@suse.cz> In-Reply-To: <83d59ba92a3c4b3ba831ebc2fce325f0416848d0.1432735040.git.mliska@suse.cz> References: <83d59ba92a3c4b3ba831ebc2fce325f0416848d0.1432735040.git.mliska@suse.cz> From: mliska Date: Wed, 27 May 2015 15:56:45 +0200 Subject: [PATCH 04/35] Change use to type-based pool allocator in lra.c. To: gcc-patches@gcc.gnu.org X-IsSubscribed: yes gcc/ChangeLog: 2015-04-30 Martin Liska * lra.c (init_insn_regs): Use new type-based pool allocator. (new_insn_reg) Likewise. (free_insn_reg) Likewise. (free_insn_regs) Likewise. (finish_insn_regs) Likewise. (init_insn_recog_data) Likewise. (init_reg_info) Likewise. (finish_reg_info) Likewise. (lra_free_copies) Likewise. (lra_create_copy) Likewise. (invalidate_insn_data_regno_info) Likewise. --- gcc/lra-int.h | 31 +++++++++++++++++++++++++++++++ gcc/lra.c | 40 ++++++++++------------------------------ 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/gcc/lra-int.h b/gcc/lra-int.h index 4bdd2c6..ef137e0 100644 --- a/gcc/lra-int.h +++ b/gcc/lra-int.h @@ -84,6 +84,22 @@ struct lra_copy int regno1, regno2; /* Next copy with correspondingly REGNO1 and REGNO2. */ lra_copy_t regno1_next, regno2_next; + + /* Pool allocation new operator. */ + inline void *operator new (size_t) + { + return pool.allocate (); + } + + /* Delete operator utilizing pool allocation. */ + inline void operator delete (void *ptr) + { + pool.remove((lra_copy *) ptr); + } + + /* Memory allocation pool. */ + static pool_allocator pool; + }; /* Common info about a register (pseudo or hard register). */ @@ -191,6 +207,21 @@ struct lra_insn_reg int regno; /* Next reg info of the same insn. */ struct lra_insn_reg *next; + + /* Pool allocation new operator. */ + inline void *operator new (size_t) + { + return pool.allocate (); + } + + /* Delete operator utilizing pool allocation. */ + inline void operator delete (void *ptr) + { + pool.remove((lra_insn_reg *) ptr); + } + + /* Memory allocation pool. */ + static pool_allocator pool; }; /* Static part (common info for insns with the same ICODE) of LRA diff --git a/gcc/lra.c b/gcc/lra.c index 7440668..456f618 100644 --- a/gcc/lra.c +++ b/gcc/lra.c @@ -550,15 +550,7 @@ lra_update_dups (lra_insn_recog_data_t id, signed char *nops) insns. */ /* Pools for insn reg info. */ -static alloc_pool insn_reg_pool; - -/* Initiate pool for insn reg info. */ -static void -init_insn_regs (void) -{ - insn_reg_pool - = create_alloc_pool ("insn regs", sizeof (struct lra_insn_reg), 100); -} +pool_allocator lra_insn_reg::pool ("insn regs", 100); /* Create LRA insn related info about a reference to REGNO in INSN with TYPE (in/out/inout), biggest reference mode MODE, flag that it is @@ -570,9 +562,7 @@ new_insn_reg (rtx_insn *insn, int regno, enum op_type type, machine_mode mode, bool subreg_p, bool early_clobber, struct lra_insn_reg *next) { - struct lra_insn_reg *ir; - - ir = (struct lra_insn_reg *) pool_alloc (insn_reg_pool); + lra_insn_reg *ir = new lra_insn_reg (); ir->type = type; ir->biggest_mode = mode; if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (lra_reg_info[regno].biggest_mode) @@ -585,13 +575,6 @@ new_insn_reg (rtx_insn *insn, int regno, enum op_type type, return ir; } -/* Free insn reg info IR. */ -static void -free_insn_reg (struct lra_insn_reg *ir) -{ - pool_free (insn_reg_pool, ir); -} - /* Free insn reg info list IR. */ static void free_insn_regs (struct lra_insn_reg *ir) @@ -601,7 +584,7 @@ free_insn_regs (struct lra_insn_reg *ir) for (; ir != NULL; ir = next_ir) { next_ir = ir->next; - free_insn_reg (ir); + delete ir; } } @@ -609,7 +592,7 @@ free_insn_regs (struct lra_insn_reg *ir) static void finish_insn_regs (void) { - free_alloc_pool (insn_reg_pool); + lra_insn_reg::pool.release (); } @@ -737,7 +720,6 @@ init_insn_recog_data (void) { lra_insn_recog_data_len = 0; lra_insn_recog_data = NULL; - init_insn_regs (); } /* Expand, if necessary, LRA data about insns. */ @@ -791,6 +773,8 @@ finish_insn_recog_data (void) if ((data = lra_insn_recog_data[i]) != NULL) free_insn_recog_data (data); finish_insn_regs (); + lra_copy::pool.release (); + lra_insn_reg::pool.release (); free (lra_insn_recog_data); } @@ -1310,7 +1294,7 @@ get_new_reg_value (void) } /* Pools for copies. */ -static alloc_pool copy_pool; +pool_allocator lra_copy::pool ("lra copies", 100); /* Vec referring to pseudo copies. */ static vec copy_vec; @@ -1350,8 +1334,6 @@ init_reg_info (void) lra_reg_info = XNEWVEC (struct lra_reg, reg_info_size); for (i = 0; i < reg_info_size; i++) initialize_lra_reg_info_element (i); - copy_pool - = create_alloc_pool ("lra copies", sizeof (struct lra_copy), 100); copy_vec.create (100); } @@ -1366,8 +1348,6 @@ finish_reg_info (void) bitmap_clear (&lra_reg_info[i].insn_bitmap); free (lra_reg_info); reg_info_size = 0; - free_alloc_pool (copy_pool); - copy_vec.release (); } /* Expand common reg info if it is necessary. */ @@ -1394,7 +1374,7 @@ lra_free_copies (void) { cp = copy_vec.pop (); lra_reg_info[cp->regno1].copies = lra_reg_info[cp->regno2].copies = NULL; - pool_free (copy_pool, cp); + delete cp; } } @@ -1416,7 +1396,7 @@ lra_create_copy (int regno1, int regno2, int freq) regno2 = regno1; regno1 = temp; } - cp = (lra_copy_t) pool_alloc (copy_pool); + cp = new lra_copy (); copy_vec.safe_push (cp); cp->regno1_dest_p = regno1_dest_p; cp->freq = freq; @@ -1585,7 +1565,7 @@ invalidate_insn_data_regno_info (lra_insn_recog_data_t data, rtx_insn *insn, { i = ir->regno; next_ir = ir->next; - free_insn_reg (ir); + delete ir; bitmap_clear_bit (&lra_reg_info[i].insn_bitmap, uid); if (i >= FIRST_PSEUDO_REGISTER && ! debug_p) {