Change use to type-based pool allocator in sh.c.
authorMartin Liska <mliska@suse.cz>
Mon, 1 Jun 2015 12:38:48 +0000 (14:38 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 1 Jun 2015 12:38:48 +0000 (12:38 +0000)
* config/sh/sh.c (add_constant):Use new type-based pool allocator.
(sh_reorg) Likewise.

From-SVN: r223951

gcc/ChangeLog
gcc/config/sh/sh.c

index ef7e40afee757a318a2d1d623a92b33bcb316c28..cf39571caa605b5f0b07444eb98b510625458736 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-01  Martin Liska  <mliska@suse.cz>
+
+       * config/sh/sh.c (add_constant):Use new type-based pool allocator.
+       (sh_reorg) Likewise.
+
 2015-06-01  Martin Liska  <mliska@suse.cz>
 
        * cfg.c (initialize_original_copy_tables):Use new type-based pool allocator.
index bc1ce24a9cc911b3c9b9f37ab3ca25b39d8313e8..285aa1808ed15512d1d32c4510baac2f9a13b1f1 100644 (file)
@@ -4648,14 +4648,31 @@ gen_datalabel_ref (rtx sym)
 }
 
 \f
-static alloc_pool label_ref_list_pool;
-
 typedef struct label_ref_list_d
 {
   rtx_code_label *label;
   struct label_ref_list_d *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 ((label_ref_list_d *) ptr);
+  }
+
+  /* Memory allocation pool.  */
+  static pool_allocator<label_ref_list_d> pool;
+
 } *label_ref_list_t;
 
+pool_allocator<label_ref_list_d> label_ref_list_d::pool
+  ("label references list", 30);
+
 /* The SH cannot load a large constant into a register, constants have to
    come from a pc relative load.  The reference of a pc relative load
    instruction must be less than 1k in front of the instruction.  This
@@ -4775,7 +4792,7 @@ add_constant (rtx x, machine_mode mode, rtx last_value)
                }
              if (lab && pool_window_label)
                {
-                 newref = (label_ref_list_t) pool_alloc (label_ref_list_pool);
+                 newref = new label_ref_list_d;
                  newref->label = pool_window_label;
                  ref = pool_vector[pool_window_last].wend;
                  newref->next = ref;
@@ -4804,7 +4821,7 @@ add_constant (rtx x, machine_mode mode, rtx last_value)
   pool_vector[pool_size].part_of_sequence_p = (lab == 0);
   if (lab && pool_window_label)
     {
-      newref = (label_ref_list_t) pool_alloc (label_ref_list_pool);
+      newref = new label_ref_list_d;
       newref->label = pool_window_label;
       ref = pool_vector[pool_window_last].wend;
       newref->next = ref;
@@ -6359,9 +6376,6 @@ sh_reorg (void)
 
   /* Scan the function looking for move instructions which have to be
      changed to pc-relative loads and insert the literal tables.  */
-  label_ref_list_pool = create_alloc_pool ("label references list",
-                                          sizeof (struct label_ref_list_d),
-                                          30);
   mdep_reorg_phase = SH_FIXUP_PCLOAD;
   for (insn = first, num_mova = 0; insn; insn = NEXT_INSN (insn))
     {
@@ -6553,7 +6567,7 @@ sh_reorg (void)
          insn = barrier;
        }
     }
-  free_alloc_pool (label_ref_list_pool);
+  label_ref_list_d::pool.release ();
   for (insn = first; insn; insn = NEXT_INSN (insn))
     PUT_MODE (insn, VOIDmode);