From: Martin Liska Date: Tue, 29 Oct 2019 13:52:42 +0000 (+0100) Subject: Release function and edge summaries allocated with GGC. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=78cd68c0af1ba80b29849712f8defe51fd232ee7;p=gcc.git Release function and edge summaries allocated with GGC. 2019-10-29 Martin Liska * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index caaa5eeff64..8e729b3de51 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2019-10-29 Martin Liska + + * 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 PR tree-optimization/92260 diff --git a/gcc/ggc.h b/gcc/ggc.h index 64d1f188eb0..d5735d09ced 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 +inline T * +ggc_alloc_no_dtor (ALONE_CXX_MEM_STAT_INFO) +{ + return static_cast (ggc_internal_alloc (sizeof (T), NULL, 0, 1 + PASS_MEM_STAT)); +} + template 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 (); + 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 (symtab); + class ipa_fn_summary_t *summary + = new (ggc_alloc_no_dtor ()) 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 ()) + = (new (ggc_alloc_no_dtor ()) ipa_edge_args_sum_t (symtab, true)); if (!ipa_bits_hash_table) ipa_bits_hash_table = hash_table::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 (); + 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 ()) + = new (ggc_alloc_no_dtor ()) 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 ()) + = (new (ggc_alloc_no_dtor ()) 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 ()) + = (new (ggc_alloc_no_dtor ()) 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 ()) + = (new (ggc_alloc_no_dtor ()) 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..6b26b604b38 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::release; - void release (); + virtual ~function_summary (); /* Traverses all summarys with a function F called with ARG as argument. */ @@ -237,20 +228,14 @@ function_summary::function_summary (symbol_table *symtab, bool ggc): } template -void -function_summary::release () +function_summary::~function_summary () { - if (this->m_released) - return; - this->unregister_hooks (); /* Release all summaries. */ typedef typename hash_map ::iterator map_iterator; for (map_iterator it = m_map.begin (); it != m_map.end (); ++it) this->release ((*it).second); - - this->m_released = true; } template @@ -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::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::fast_function_summary (symbol_table *symtab): } template -void -fast_function_summary::release () +fast_function_summary::~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 @@ -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::release; - void release (); + virtual ~call_summary (); /* Traverses all summarys with an edge E called with ARG as argument. */ @@ -730,20 +692,14 @@ private: }; template -void -call_summary::release () +call_summary::~call_summary () { - if (this->m_released) - return; - this->unregister_hooks (); /* Release all summaries. */ typedef typename hash_map ::iterator map_iterator; for (map_iterator it = m_map.begin (); it != m_map.end (); ++it) this->release ((*it).second); - - this->m_released = true; } template @@ -825,14 +781,7 @@ public: } /* Destructor. */ - virtual ~fast_call_summary () - { - release (); - } - - /* Destruction method that can be called for GGC purpose. */ - using call_summary_base::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 -void -fast_call_summary::release () +fast_call_summary::~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