Hi,
this patch adds object allocators to manage IPA summaries. This reduces
malloc overhead and fragmentation.  I now get peak memory use 7.5GB instead
of 10GB for firefox WPA because reduced fragmentation leads to less COWs after
forks.  Additional bonus is that we now have statistics gathered by mem-reports
which makes my life easier, too.
(though memory stats are far from ideal - we need to pass location info around
bit more).

Bootstrapped/regtested x86_64-linux, will commit it shortly.

        * hsa-brig.c: Include alloc-pool.h
        * hsa-dump.c: Likewise.
        * hsa-gen.c: Likewise.
        * hse-regalloc.c: Likewise.
        * ipa-hsa.c: Likewise.
        * ipa-predicate.c: Likewise.
        * ipa-reference.c: Likewise.
        * ipa-sra.c: Likewise.
        * omp-expand.c: Likewise.
        * omp-general.c: Likewise.
        * omp-low.c: Likewise.
        * sumbol-summary.h (function_summary_base): Add allocator.
        (function_summary<T *>::function_summary): Update construction.
        (fast_function_summary<T *, V>::fast_function_summary): Likewise.
        (call_summary_base): Add allcator.
        (call_summary<T *>::call_summary): Update construction.
        (fast_call_summary<T *, V>::fast_call_summary): Likewise.
Index: hsa-brig.c
===================================================================
--- hsa-brig.c  (revision 277796)
+++ hsa-brig.c  (working copy)
@@ -44,6 +44,7 @@ along with GCC; see the file COPYING3.
 #include "cgraph.h"
 #include "dumpfile.h"
 #include "print-tree.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "hsa-common.h"
 #include "gomp-constants.h"
Index: hsa-dump.c
===================================================================
--- hsa-dump.c  (revision 277796)
+++ hsa-dump.c  (working copy)
@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3.
 #include "gimple-pretty-print.h"
 #include "cgraph.h"
 #include "print-tree.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "hsa-common.h"
 
Index: hsa-gen.c
===================================================================
--- hsa-gen.c   (revision 277796)
+++ hsa-gen.c   (working copy)
@@ -48,6 +48,7 @@ along with GCC; see the file COPYING3.
 #include "ssa-iterators.h"
 #include "cgraph.h"
 #include "print-tree.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "hsa-common.h"
 #include "cfghooks.h"
Index: hsa-regalloc.c
===================================================================
--- hsa-regalloc.c      (revision 277796)
+++ hsa-regalloc.c      (working copy)
@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3.
 #include "cgraph.h"
 #include "print-tree.h"
 #include "cfghooks.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "hsa-common.h"
 
Index: ipa-hsa.c
===================================================================
--- ipa-hsa.c   (revision 277796)
+++ ipa-hsa.c   (working copy)
@@ -40,6 +40,7 @@ along with GCC; see the file COPYING3.
 #include "stringpool.h"
 #include "cgraph.h"
 #include "print-tree.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "hsa-common.h"
 
Index: ipa-predicate.c
===================================================================
--- ipa-predicate.c     (revision 277796)
+++ ipa-predicate.c     (working copy)
@@ -25,8 +25,8 @@ along with GCC; see the file COPYING3.
 #include "tree.h"
 #include "cgraph.h"
 #include "tree-vrp.h"
-#include "symbol-summary.h"
 #include "alloc-pool.h"
+#include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "ipa-fnsummary.h"
 #include "real.h"
Index: ipa-reference.c
===================================================================
--- ipa-reference.c     (revision 277796)
+++ ipa-reference.c     (working copy)
@@ -48,6 +48,7 @@ along with GCC; see the file COPYING3.
 #include "calls.h"
 #include "ipa-utils.h"
 #include "ipa-reference.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 
 /* The static variables defined within the compilation unit that are
Index: ipa-sra.c
===================================================================
--- ipa-sra.c   (revision 277796)
+++ ipa-sra.c   (working copy)
@@ -75,6 +75,7 @@ along with GCC; see the file COPYING3.
 #include "gimple-walk.h"
 #include "tree-dfa.h"
 #include "tree-sra.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "params.h"
 #include "dbgcnt.h"
Index: omp-expand.c
===================================================================
--- omp-expand.c        (revision 277796)
+++ omp-expand.c        (working copy)
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.
 #include "omp-general.h"
 #include "omp-offload.h"
 #include "tree-cfgcleanup.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "gomp-constants.h"
 #include "gimple-pretty-print.h"
Index: omp-general.c
===================================================================
--- omp-general.c       (revision 277796)
+++ omp-general.c       (working copy)
@@ -37,6 +37,7 @@ along with GCC; see the file COPYING3.
 #include "attribs.h"
 #include "gimplify.h"
 #include "cgraph.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "hsa-common.h"
 #include "tree-pass.h"
Index: omp-low.c
===================================================================
--- omp-low.c   (revision 277796)
+++ omp-low.c   (working copy)
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.
 #include "omp-low.h"
 #include "omp-grid.h"
 #include "gimple-low.h"
+#include "alloc-pool.h"
 #include "symbol-summary.h"
 #include "tree-nested.h"
 #include "context.h"
Index: symbol-summary.h
===================================================================
--- symbol-summary.h    (revision 277796)
+++ symbol-summary.h    (working copy)
@@ -28,8 +28,10 @@ class function_summary_base
 {
 public:
   /* Default construction takes SYMTAB as an argument.  */
-  function_summary_base (symbol_table *symtab): m_symtab (symtab),
-  m_insertion_enabled (true)
+  function_summary_base (symbol_table *symtab CXX_MEM_STAT_INFO):
+  m_symtab (symtab),
+  m_insertion_enabled (true),
+  allocator ("function summary" PASS_MEM_STAT)
   {}
 
   /* Basic implementation of insert operation.  */
@@ -59,7 +61,8 @@ protected:
   {
     /* Call gcc_internal_because we do not want to call finalizer for
        a type T.  We call dtor explicitly.  */
-    return is_ggc () ? new (ggc_internal_alloc (sizeof (T))) T () : new T () ;
+    return is_ggc () ? new (ggc_internal_alloc (sizeof (T))) T ()
+                    : allocator.allocate () ;
   }
 
   /* Release an item that is stored within map.  */
@@ -71,7 +74,7 @@ protected:
        ggc_free (item);
       }
     else
-      delete item;
+      allocator.remove (item);
   }
 
   /* Unregister all call-graph hooks.  */
@@ -92,6 +95,7 @@ protected:
 private:
   /* Return true when the summary uses GGC memory for allocation.  */
   virtual bool is_ggc () = 0;
+  object_allocator<T> allocator;
 };
 
 template <typename T>
@@ -215,9 +219,8 @@ private:
 template <typename T>
 function_summary<T *>::function_summary (symbol_table *symtab, bool ggc
                                         MEM_STAT_DECL):
-  function_summary_base<T> (symtab), m_ggc (ggc), m_map (13, ggc, true,
-                                                        GATHER_STATISTICS
-                                                        PASS_MEM_STAT)
+  function_summary_base<T> (symtab PASS_MEM_STAT), m_ggc (ggc),
+  m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT)
 {
   this->m_symtab_insertion_hook
     = this->m_symtab->add_cgraph_insertion_hook 
(function_summary::symtab_insertion,
@@ -411,7 +414,7 @@ private:
 
 template <typename T, typename V>
 fast_function_summary<T *, V>::fast_function_summary (symbol_table *symtab 
MEM_STAT_DECL):
-  function_summary_base<T> (symtab), m_vector (NULL)
+  function_summary_base<T> (symtab PASS_MEM_STAT), m_vector (NULL)
 {
   vec_alloc (m_vector, 13 PASS_MEM_STAT);
   this->m_symtab_insertion_hook
@@ -531,8 +534,10 @@ class call_summary_base
 {
 public:
   /* Default construction takes SYMTAB as an argument.  */
-  call_summary_base (symbol_table *symtab): m_symtab (symtab),
-  m_initialize_when_cloning (false)
+  call_summary_base (symbol_table *symtab CXX_MEM_STAT_INFO):
+  m_symtab (symtab),
+  m_initialize_when_cloning (false),
+  allocator ("call summary" PASS_MEM_STAT)
   {}
 
   /* Basic implementation of removal operation.  */
@@ -547,7 +552,8 @@ protected:
   {
     /* Call gcc_internal_because we do not want to call finalizer for
        a type T.  We call dtor explicitly.  */
-    return is_ggc () ? new (ggc_internal_alloc (sizeof (T))) T () : new T () ;
+    return is_ggc () ? new (ggc_internal_alloc (sizeof (T))) T ()
+                    : allocator.allocate ();
   }
 
   /* Release an item that is stored within map.  */
@@ -559,7 +565,7 @@ protected:
        ggc_free (item);
       }
     else
-      delete item;
+      allocator.remove (item);
   }
 
   /* Unregister all call-graph hooks.  */
@@ -578,6 +584,7 @@ protected:
 private:
   /* Return true when the summary uses GGC memory for allocation.  */
   virtual bool is_ggc () = 0;
+  object_allocator<T> allocator;
 };
 
 template <typename T>
@@ -607,9 +614,8 @@ public:
   /* Default construction takes SYMTAB as an argument.  */
   call_summary (symbol_table *symtab, bool ggc = false
                CXX_MEM_STAT_INFO)
-  : call_summary_base<T> (symtab), m_ggc (ggc), m_map (13, ggc, true,
-                                                      GATHER_STATISTICS
-                                                      PASS_MEM_STAT)
+  : call_summary_base<T> (symtab PASS_MEM_STAT), m_ggc (ggc),
+    m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT)
   {
     this->m_symtab_removal_hook
       = this->m_symtab->add_edge_removal_hook (call_summary::symtab_removal,
@@ -775,7 +781,7 @@ class GTY((user)) fast_call_summary <T *
 public:
   /* Default construction takes SYMTAB as an argument.  */
   fast_call_summary (symbol_table *symtab CXX_MEM_STAT_INFO)
-  : call_summary_base<T> (symtab), m_vector (NULL)
+  : call_summary_base<T> (symtab PASS_MEM_STAT), m_vector (NULL)
   {
     vec_alloc (m_vector, 13 PASS_MEM_STAT);
     this->m_symtab_removal_hook

Reply via email to