Hi. The patch is about {symbol,edge}_summary simplification where ::release function is removed. Instead of it, one should use either delete operand (for heap summaries), or explicitly call destructor and ggc_free.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin gcc/ChangeLog: 2019-10-29 Martin Liska <mli...@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. --- gcc/ggc.h | 12 +++++++ gcc/ipa-fnsummary.c | 6 ++-- gcc/ipa-fnsummary.h | 4 +-- gcc/ipa-prop.c | 11 +++--- gcc/ipa-prop.h | 4 +-- gcc/ipa-sra.c | 9 ++--- gcc/symbol-summary.h | 80 ++++++-------------------------------------- 7 files changed, 41 insertions(+), 85 deletions(-)
diff --git a/gcc/ggc.h b/gcc/ggc.h index 31606dc843f..ede36c42eb3 100644 --- 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) diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c index 0d38e42546d..f01709caf28 100644 --- a/gcc/ipa-fnsummary.c +++ b/gcc/ipa-fnsummary.c @@ -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; } diff --git a/gcc/ipa-fnsummary.h b/gcc/ipa-fnsummary.h index f6457303689..525d4b70207 100644 --- a/gcc/ipa-fnsummary.h +++ b/gcc/ipa-fnsummary.h @@ -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; } diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 0dd73561419..9dfbe1a12d6 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -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; } diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h index 6811ed765df..07a7eea9249 100644 --- a/gcc/ipa-prop.h +++ b/gcc/ipa-prop.h @@ -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)); } diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c index 836db401588..038f38b912a 100644 --- a/gcc/ipa-sra.c +++ b/gcc/ipa-sra.c @@ -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) diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h index a0bacadb63b..65414a6aaf6 100644 --- a/gcc/symbol-summary.h +++ b/gcc/symbol-summary.h @@ -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,14 @@ 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 +528,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 +570,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 +613,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 +691,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 +780,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 +856,14 @@ 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>
pEpkey.asc
Description: application/pgp-keys