Hi. I've spotted couple of occurrences of following memory leak seen by valgrind:
malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) operator new(unsigned long) (new_op.cc:50) remap_dependence_clique(copy_body_data*, unsigned short) (tree-inline.c:845) remap_gimple_op_r(tree_node**, int*, void*) (tree-inline.c:954) walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) (tree.c:11498) walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) (tree.c:11815) walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) (tree.c:11815) walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) (tree.c:11815) copy_debug_stmt (tree-inline.c:2869) copy_debug_stmts (tree-inline.c:2927) copy_body(copy_body_data*, long, int, basic_block_def*, basic_block_def*, basic_block_def*) (tree-inline.c:2961) tree_function_versioning(tree_node*, tree_node*, vec<ipa_replace_map*, va_gc, vl_embed>*, bool, bitmap_head*, bool, bitmap_head*, basic_block_def*) (tree-inline.c:5907) save_inline_function_body (ipa-inline-transform.c:485) inline_transform(cgraph_node*) (ipa-inline-transform.c:541) Problem is that the id->dependence_map is released before copy_debug_stmts is called. Patch can bootstrap and survives regression tests on x86_64-linux-gnu. Ready for trunk? Martin
>From c67fe154a24b939edad28a823c2ecb16f6e056c1 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Wed, 6 Jan 2016 11:41:31 +0100 Subject: [PATCH] Properly release memory in copy_body gcc/ChangeLog: 2016-01-06 Martin Liska <mli...@suse.cz> * tree-inline.c (copy_cfg_body): Remove eh_map deletion. (copy_body): Release it here. --- gcc/tree-inline.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 19f202e..92169e6 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2807,17 +2807,6 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale, entry_block_map->aux = NULL; exit_block_map->aux = NULL; - if (id->eh_map) - { - delete id->eh_map; - id->eh_map = NULL; - } - if (id->dependence_map) - { - delete id->dependence_map; - id->dependence_map = NULL; - } - return new_fndecl; } @@ -2963,6 +2952,17 @@ copy_body (copy_body_data *id, gcov_type count, int frequency_scale, new_entry); copy_debug_stmts (id); + if (id->eh_map) + { + delete id->eh_map; + id->eh_map = NULL; + } + if (id->dependence_map) + { + delete id->dependence_map; + id->dependence_map = NULL; + } + return body; } -- 2.8.1