+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
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)
{
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 ();
{
if (!ipa_size_summaries)
return;
- ipa_size_summaries->release ();
+ delete ipa_size_summaries;
ipa_size_summaries = NULL;
}
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;
}
{
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);
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;
}
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;
}
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;
}
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;
}
{
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));
}
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);
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);
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)
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. */
/* 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. */
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. */
}
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>
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. */
}
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>
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. */
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. */
}
/* 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. */
};
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>
}
/* 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. */
};
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>