Release function and edge summaries allocated with GGC.
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
This commit is contained in:
parent
318bd8c60d
commit
78cd68c0af
8 changed files with 62 additions and 83 deletions
|
@ -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
|
||||
|
|
12
gcc/ggc.h
12
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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue