On 05/27/2015 07:50 PM, Jeff Law wrote:
On 05/27/2015 07:56 AM, mliska wrote:
gcc/ChangeLog:
2015-04-30 Martin Liska <mli...@suse.cz>
* 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.
OK.
jeff
v2
>From d4b64952961e379f6d26d609369dc0de4fd0236f Mon Sep 17 00:00:00 2001
From: mliska <mli...@suse.cz>
Date: Wed, 27 May 2015 15:56:45 +0200
Subject: [PATCH 04/32] Change use to type-based pool allocator in lra.c.
gcc/ChangeLog:
2015-04-30 Martin Liska <mli...@suse.cz>
* 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 42e4a54..25bd3ce 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<lra_copy> 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<lra_insn_reg> 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> 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> lra_copy::pool ("lra copies", 100);
/* Vec referring to pseudo copies. */
static vec<lra_copy_t> 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)
{
--
2.1.4