Release function and edge summaries allocated with GGC.
authorMartin Liska <mliska@suse.cz>
Tue, 29 Oct 2019 13:52:42 +0000 (14:52 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 29 Oct 2019 13:52:42 +0000 (13:52 +0000)
2019-10-29  Martin Liska  <mliska@suse.cz>

* ggc.h (ggc_alloc_no_dtor): New function.
* ipa-fnsummary.c (ipa_free_fn_summary): Call
destructor and ggc_free.
(ipa_free_size_summary): Call delete instead
of release.
* ipa-fnsummary.h: Use new function ggc_alloc_no_dtor.
* ipa-prop.c (ipa_check_create_edge_args): Likewise.
(ipa_free_all_edge_args): Call destructor and ggc_free.
(ipa_free_all_node_params): Likewise.
(ipcp_free_transformation_sum): Likewise.
* ipa-prop.h (ipa_check_create_node_params):
Call new ggc_alloc_no_dtor.
* ipa-sra.c (ipa_sra_generate_summary): Likewise.
(ipa_sra_analysis): Call destructor and ggc_free.
Replace release with delete operator.
* symbol-summary.h (release): Remove ..
(V>::~fast_function_summary): and move logic here.
Likewise for other classes.

From-SVN: r277572

gcc/ChangeLog
gcc/ggc.h
gcc/ipa-fnsummary.c
gcc/ipa-fnsummary.h
gcc/ipa-prop.c
gcc/ipa-prop.h
gcc/ipa-sra.c
gcc/symbol-summary.h

index caaa5eeff6402a75bca730633d9c82fa6398fe99..8e729b3de51193f43618d13d6061195e28e7009e 100644 (file)
@@ -1,3 +1,24 @@
+2019-10-29  Martin Liska  <mliska@suse.cz>
+
+       * ggc.h (ggc_alloc_no_dtor): New function.
+       * ipa-fnsummary.c (ipa_free_fn_summary): Call
+       destructor and ggc_free.
+       (ipa_free_size_summary): Call delete instead
+       of release.
+       * ipa-fnsummary.h: Use new function ggc_alloc_no_dtor.
+       * ipa-prop.c (ipa_check_create_edge_args): Likewise.
+       (ipa_free_all_edge_args): Call destructor and ggc_free.
+       (ipa_free_all_node_params): Likewise.
+       (ipcp_free_transformation_sum): Likewise.
+       * ipa-prop.h (ipa_check_create_node_params):
+       Call new ggc_alloc_no_dtor.
+       * ipa-sra.c (ipa_sra_generate_summary): Likewise.
+       (ipa_sra_analysis): Call destructor and ggc_free.
+       Replace release with delete operator.
+       * symbol-summary.h (release): Remove ..
+       (V>::~fast_function_summary): and move logic here.
+       Likewise for other classes.
+
 2019-10-29  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/92260
index 64d1f188eb0b74264f15d5c0b78d0b3cb2d34787..d5735d09ced08b5cbd6c26c420737b5e57561b69 100644 (file)
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -185,6 +185,18 @@ ggc_alloc (ALONE_CXX_MEM_STAT_INFO)
                                                 PASS_MEM_STAT));
 }
 
+/* GGC allocation function that does not call finalizer for type
+   that have need_finalization_p equal to true.  User is responsible
+   for calling of the destructor.  */
+
+template<typename T>
+inline T *
+ggc_alloc_no_dtor (ALONE_CXX_MEM_STAT_INFO)
+{
+  return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1
+                                              PASS_MEM_STAT));
+}
+
 template<typename T>
 inline T *
 ggc_cleared_alloc (ALONE_CXX_MEM_STAT_INFO)
index 0d38e42546de524b3197d53da3b28681afe95e8d..f01709caf28a343e636879cc97814b5494302ca9 100644 (file)
@@ -3873,9 +3873,9 @@ ipa_free_fn_summary (void)
 {
   if (!ipa_call_summaries)
     return;
-  ipa_fn_summaries->release ();
+  ipa_fn_summaries->~fast_function_summary <ipa_fn_summary *, va_gc> ();
+  ggc_free (ipa_fn_summaries);
   ipa_fn_summaries = NULL;
-  ipa_call_summaries->release ();
   delete ipa_call_summaries;
   ipa_call_summaries = NULL;
   edge_predicate_pool.release ();
@@ -3891,7 +3891,7 @@ ipa_free_size_summary (void)
 {
   if (!ipa_size_summaries)
     return;
-  ipa_size_summaries->release ();
+  delete ipa_size_summaries;
   ipa_size_summaries = NULL;
 }
 
index f6457303689d7d5330e108a6931fb400513c2703..525d4b702073b90bbad6bc8f3cc0b42d5f971cb8 100644 (file)
@@ -194,8 +194,8 @@ public:
 
   static ipa_fn_summary_t *create_ggc (symbol_table *symtab)
   {
-    class ipa_fn_summary_t *summary = new (ggc_alloc <ipa_fn_summary_t> ())
-      ipa_fn_summary_t (symtab);
+    class ipa_fn_summary_t *summary
+      = new (ggc_alloc_no_dtor<ipa_fn_summary_t> ()) ipa_fn_summary_t (symtab);
     summary->disable_insertion_hook ();
     return summary;
   }
index 0dd735614191fe1b58cee9e2e28901b0a39f9553..9dfbe1a12d6ee7dd667078c7a4e57e65a2347175 100644 (file)
@@ -3719,7 +3719,7 @@ ipa_check_create_edge_args (void)
 {
   if (!ipa_edge_args_sum)
     ipa_edge_args_sum
-      = (new (ggc_cleared_alloc <ipa_edge_args_sum_t> ())
+      = (new (ggc_alloc_no_dtor<ipa_edge_args_sum_t> ())
         ipa_edge_args_sum_t (symtab, true));
   if (!ipa_bits_hash_table)
     ipa_bits_hash_table = hash_table<ipa_bit_ggc_hash_traits>::create_ggc (37);
@@ -3735,7 +3735,8 @@ ipa_free_all_edge_args (void)
   if (!ipa_edge_args_sum)
     return;
 
-  ipa_edge_args_sum->release ();
+  ipa_edge_args_sum->~ipa_edge_args_sum_t ();
+  ggc_free (ipa_edge_args_sum);
   ipa_edge_args_sum = NULL;
 }
 
@@ -3744,7 +3745,8 @@ ipa_free_all_edge_args (void)
 void
 ipa_free_all_node_params (void)
 {
-  ipa_node_params_sum->release ();
+  ipa_node_params_sum->~ipa_node_params_t ();
+  ggc_free (ipa_node_params_sum);
   ipa_node_params_sum = NULL;
 }
 
@@ -3770,7 +3772,8 @@ ipcp_free_transformation_sum (void)
   if (!ipcp_transformation_sum)
     return;
 
-  ipcp_transformation_sum->release ();
+  ipcp_transformation_sum->~function_summary<ipcp_transformation *> ();
+  ggc_free (ipcp_transformation_sum);
   ipcp_transformation_sum = NULL;
 }
 
index 6811ed765df1e0ca3a67e9fd8126c6b43b5aad93..07a7eea9249110b347bef11f11b50d7502a4ab22 100644 (file)
@@ -672,7 +672,7 @@ public:
   static ipcp_transformation_t *create_ggc (symbol_table *symtab)
   {
     ipcp_transformation_t *summary
-      = new (ggc_cleared_alloc <ipcp_transformation_t> ())
+      = new (ggc_alloc_no_dtor <ipcp_transformation_t> ())
       ipcp_transformation_t (symtab, true);
     return summary;
   }
@@ -710,7 +710,7 @@ ipa_check_create_node_params (void)
 {
   if (!ipa_node_params_sum)
     ipa_node_params_sum
-      = (new (ggc_cleared_alloc <ipa_node_params_t> ())
+      = (new (ggc_alloc_no_dtor <ipa_node_params_t> ())
         ipa_node_params_t (symtab, true));
 }
 
index 836db4015880d747f716f30b90e8d703ce424f4b..038f38b912a59b1b1083c553f999df29ba9f3118 100644 (file)
@@ -2546,7 +2546,7 @@ ipa_sra_generate_summary (void)
   gcc_checking_assert (!func_sums);
   gcc_checking_assert (!call_sums);
   func_sums
-    = (new (ggc_cleared_alloc <ipa_sra_function_summaries> ())
+    = (new (ggc_alloc_no_dtor <ipa_sra_function_summaries> ())
        ipa_sra_function_summaries (symtab, true));
   call_sums = new ipa_sra_call_summaries (symtab);
 
@@ -2805,7 +2805,7 @@ ipa_sra_read_summary (void)
   gcc_checking_assert (!func_sums);
   gcc_checking_assert (!call_sums);
   func_sums
-    = (new (ggc_cleared_alloc <ipa_sra_function_summaries> ())
+    = (new (ggc_alloc_no_dtor <ipa_sra_function_summaries> ())
        ipa_sra_function_summaries (symtab, true));
   call_sums = new ipa_sra_call_summaries (symtab);
 
@@ -3989,9 +3989,10 @@ ipa_sra_analysis (void)
     process_isra_node_results (node, clone_num_suffixes);
 
   delete clone_num_suffixes;
-  func_sums->release ();
+  func_sums->~ipa_sra_function_summaries ();
+  ggc_free (func_sums);
   func_sums = NULL;
-  call_sums->release ();
+  delete call_sums;
   call_sums = NULL;
 
   if (dump_file)
index a0bacadb63bbc7e418052b01afc8fcbb463c3011..6b26b604b380c4b5f679c99b9fd1d4e13a94fcac 100644 (file)
@@ -29,7 +29,7 @@ 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), m_released (false)
+  m_insertion_enabled (true)
   {}
 
   /* Basic implementation of insert operation.  */
@@ -88,8 +88,6 @@ protected:
 
   /* Indicates if insertion hook is enabled.  */
   bool m_insertion_enabled;
-  /* Indicates if the summary is released.  */
-  bool m_released;
 
 private:
   /* Return true when the summary uses GGC memory for allocation.  */
@@ -134,14 +132,7 @@ public:
   function_summary (symbol_table *symtab, bool ggc = false);
 
   /* Destructor.  */
-  virtual ~function_summary ()
-  {
-    release ();
-  }
-
-  /* Destruction method that can be called for GGC purpose.  */
-  using function_summary_base<T>::release;
-  void release ();
+  virtual ~function_summary ();
 
   /* Traverses all summarys with a function F called with
      ARG as argument.  */
@@ -237,20 +228,14 @@ function_summary<T *>::function_summary (symbol_table *symtab, bool ggc):
 }
 
 template <typename T>
-void
-function_summary<T *>::release ()
+function_summary<T *>::~function_summary ()
 {
-  if (this->m_released)
-    return;
-
   this->unregister_hooks ();
 
   /* Release all summaries.  */
   typedef typename hash_map <map_hash, T *>::iterator map_iterator;
   for (map_iterator it = m_map.begin (); it != m_map.end (); ++it)
     this->release ((*it).second);
-
-  this->m_released = true;
 }
 
 template <typename T>
@@ -343,14 +328,7 @@ public:
   fast_function_summary (symbol_table *symtab);
 
   /* Destructor.  */
-  virtual ~fast_function_summary ()
-  {
-    release ();
-  }
-
-  /* Destruction method that can be called for GGC purpose.  */
-  using function_summary_base<T>::release;
-  void release ();
+  virtual ~fast_function_summary ();
 
   /* Traverses all summarys with a function F called with
      ARG as argument.  */
@@ -445,22 +423,15 @@ fast_function_summary<T *, V>::fast_function_summary (symbol_table *symtab):
 }
 
 template <typename T, typename V>
-void
-fast_function_summary<T *, V>::release ()
+fast_function_summary<T *, V>::~fast_function_summary ()
 {
-  if (this->m_released)
-    return;
-
   this->unregister_hooks ();
 
   /* Release all summaries.  */
   for (unsigned i = 0; i < m_vector->length (); i++)
     if ((*m_vector)[i] != NULL)
       this->release ((*m_vector)[i]);
-
   vec_free (m_vector);
-  this->m_released = true;
 }
 
 template <typename T, typename V>
@@ -558,7 +529,7 @@ 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 (true), m_released (false)
+  m_initialize_when_cloning (true)
   {}
 
   /* Basic implementation of removal operation.  */
@@ -600,8 +571,6 @@ protected:
   cgraph_2edge_hook_list *m_symtab_duplication_hook;
   /* Initialize summary for an edge that is cloned.  */
   bool m_initialize_when_cloning;
-  /* Indicates if the summary is released.  */
-  bool m_released;
 
 private:
   /* Return true when the summary uses GGC memory for allocation.  */
@@ -645,14 +614,7 @@ public:
   }
 
   /* Destructor.  */
-  virtual ~call_summary ()
-  {
-    release ();
-  }
-
-  /* Destruction method that can be called for GGC purpose.  */
-  using call_summary_base<T>::release;
-  void release ();
+  virtual ~call_summary ();
 
   /* Traverses all summarys with an edge E called with
      ARG as argument.  */
@@ -730,20 +692,14 @@ private:
 };
 
 template <typename T>
-void
-call_summary<T *>::release ()
+call_summary<T *>::~call_summary ()
 {
-  if (this->m_released)
-    return;
-
   this->unregister_hooks ();
 
   /* Release all summaries.  */
   typedef typename hash_map <map_hash, T *>::iterator map_iterator;
   for (map_iterator it = m_map.begin (); it != m_map.end (); ++it)
     this->release ((*it).second);
-
-  this->m_released = true;
 }
 
 template <typename T>
@@ -825,14 +781,7 @@ public:
   }
 
   /* Destructor.  */
-  virtual ~fast_call_summary ()
-  {
-    release ();
-  }
-
-  /* Destruction method that can be called for GGC purpose.  */
-  using call_summary_base<T>::release;
-  void release ();
+  virtual ~fast_call_summary ();
 
   /* Traverses all summarys with an edge F called with
      ARG as argument.  */
@@ -908,22 +857,15 @@ private:
 };
 
 template <typename T, typename V>
-void
-fast_call_summary<T *, V>::release ()
+fast_call_summary<T *, V>::~fast_call_summary ()
 {
-  if (this->m_released)
-    return;
-
   this->unregister_hooks ();
 
   /* Release all summaries.  */
   for (unsigned i = 0; i < m_vector->length (); i++)
     if ((*m_vector)[i] != NULL)
       this->release ((*m_vector)[i]);
-
   vec_free (m_vector);
-
-  this->m_released = true;
 }
 
 template <typename T, typename V>