This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix memory leak in IPA passes
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Martin Liška <mliska at suse dot cz>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jan Hubicka <hubicka at ucw dot cz>
- Date: Tue, 14 Apr 2015 15:45:13 +0200
- Subject: Re: [PATCH] Fix memory leak in IPA passes
- Authentication-results: sourceware.org; auth=none
- References: <552CCC4E dot 7090208 at suse dot cz>
>
> 2015-04-13 Martin Liska <mliska@suse.cz>
>
> * ipa-cp.c (ipcp_driver): Release prev_edge_clone.
> * ipa-icf.c (sem_item_optimizer::subdivide_classes_by_sensitive_refs):
> Release symbol_compare_collection.
> * ipa-reference.c: Add TODO that a vector should be released.
> ---
> gcc/ipa-cp.c | 1 +
> gcc/ipa-icf.c | 26 ++++++++++++++++++++------
> gcc/ipa-reference.c | 1 +
> 3 files changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
> index bfe4821..3824029 100644
> --- a/gcc/ipa-cp.c
> +++ b/gcc/ipa-cp.c
> @@ -4493,6 +4493,7 @@ ipcp_driver (void)
> /* Free all IPCP structures. */
> free_toporder_info (&topo);
> next_edge_clone.release ();
> + prev_edge_clone.release ();
> symtab->remove_edge_removal_hook (edge_removal_hook_holder);
> symtab->remove_edge_duplication_hook (edge_duplication_hook_holder);
> ipa_free_all_structures_after_ipa_cp ();
I already fixed this one on mainline.
> diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
> index b902373..a72ac2e 100644
> --- a/gcc/ipa-icf.c
> +++ b/gcc/ipa-icf.c
> @@ -2712,6 +2712,9 @@ sem_item_optimizer::subdivide_classes_by_equality (bool in_wpa)
> unsigned
> sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
> {
> + typedef hash_map <symbol_compare_collection *, vec <sem_item *>,
> + symbol_compare_hashmap_traits> subdivide_hash_map;
> +
> unsigned newly_created_classes = 0;
>
> for (hash_table <congruence_class_group_hash>::iterator it = m_classes.begin ();
> @@ -2726,8 +2729,7 @@ sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
>
> if (c->members.length() > 1)
> {
> - hash_map <symbol_compare_collection *, vec <sem_item *>,
> - symbol_compare_hashmap_traits> split_map;
> + subdivide_hash_map split_map;
>
> for (unsigned j = 0; j < c->members.length (); j++)
> {
> @@ -2735,10 +2737,15 @@ sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
>
> symbol_compare_collection *collection = new symbol_compare_collection (source_node->node);
>
> - vec <sem_item *> *slot = &split_map.get_or_insert (collection);
> + bool existed;
> + vec <sem_item *> *slot = &split_map.get_or_insert (collection,
> + &existed);
> gcc_checking_assert (slot);
>
> slot->safe_push (source_node);
> +
> + if (existed)
> + delete collection;
> }
>
> /* If the map contains more than one key, we have to split the map
> @@ -2747,9 +2754,8 @@ sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
> {
> bool first_class = true;
>
> - hash_map <symbol_compare_collection *, vec <sem_item *>,
> - symbol_compare_hashmap_traits>::iterator it2 = split_map.begin ();
> - for (; it2 != split_map.end (); ++it2)
> + for (subdivide_hash_map::iterator it2 = split_map.begin ();
> + it2 != split_map.end (); ++it2)
> {
> congruence_class *new_cls;
> new_cls = new congruence_class (class_id++);
> @@ -2772,6 +2778,14 @@ sem_item_optimizer::subdivide_classes_by_sensitive_refs ()
> }
> }
> }
> +
> + /* Release memory. */
> + for (subdivide_hash_map::iterator it2 = split_map.begin ();
> + it2 != split_map.end (); ++it2)
> + {
> + delete (*it2).first;
> + (*it2).second.release ();
> + }
> }
> }
>
This is OK.
> diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
> index 219a9b3..a420cb2 100644
> --- a/gcc/ipa-reference.c
> +++ b/gcc/ipa-reference.c
> @@ -150,6 +150,7 @@ static struct cgraph_node_hook_list *node_removal_hook_holder;
> Indexed by UID of call graph nodes. */
> static vec<ipa_reference_vars_info_t> ipa_reference_vars_vector;
>
> +/* TODO: find a place where we should release the vector. */
> static vec<ipa_reference_optimization_summary_t> ipa_reference_opt_sum_vector;
>
> /* Return the ipa_reference_vars structure starting from the cgraph NODE. */
Hmm, I guess this only makes sense for jitting, because the vector is used thorough
whole late complation (and should be turned into the summary template)
OK
Honza
> --
> 2.1.4
>