http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56461



--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-02-26 
15:53:22 UTC ---

Created attachment 29541

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29541

gcc48-pr56461.patch



The biggest leak there is:

==31825== 1,491,200 bytes in 11,650 blocks are definitely lost in loss record

2,736 of 2,737

==31825==    at 0x4A0881C: malloc (vg_replace_malloc.c:270)

==31825==    by 0x131514F: xrealloc (xmalloc.c:177)

==31825==    by 0xE13FA4: void

va_heap::reserve<_edge_var_map>(vec<_edge_var_map, va_heap, vl_embed>*&,

unsigned int, bool) (vec.h:300)

==31825==    by 0xE13DF9: vec<_edge_var_map, va_heap, vl_ptr>::reserve(unsigned

int, bool) (vec.h:1468)

==31825==    by 0xE13D9A: vec<_edge_var_map, va_heap,

vl_ptr>::reserve_exact(unsigned int) (vec.h:1482)

==31825==    by 0xE13CEE: vec<_edge_var_map, va_heap, vl_ptr>::create(unsigned

int) (vec.h:1497)

==31825==    by 0xE0D5BE: redirect_edge_var_map_add(edge_def*, tree_node*,

tree_node*, unsigned int) (tree-ssa.c:64)

==31825==    by 0xE0D8A5: ssa_redirect_edge(edge_def*, basic_block_def*)

(tree-ssa.c:198)

==31825==    by 0xC7862B: gimple_redirect_edge_and_branch(edge_def*,

basic_block_def*) (tree-cfg.c:5304)

==31825==    by 0x85EC9A: redirect_edge_and_branch(edge_def*, basic_block_def*)

(cfghooks.c:333)

==31825==    by 0xC6F03D: gimple_split_edge(edge_def*) (tree-cfg.c:2475)

==31825==    by 0x85F51A: split_edge(edge_def*) (cfghooks.c:592)

==31825== 

==31825== 2,430,848 bytes in 18,991 blocks are definitely lost in loss record

2,737 of 2,737

==31825==    at 0x4A0881C: malloc (vg_replace_malloc.c:270)

==31825==    by 0x131514F: xrealloc (xmalloc.c:177)

==31825==    by 0xE13FA4: void

va_heap::reserve<_edge_var_map>(vec<_edge_var_map, va_heap, vl_embed>*&,

unsigned int, bool) (vec.h:300)

==31825==    by 0xE13DF9: vec<_edge_var_map, va_heap, vl_ptr>::reserve(unsigned

int, bool) (vec.h:1468)

==31825==    by 0xE13D9A: vec<_edge_var_map, va_heap,

vl_ptr>::reserve_exact(unsigned int) (vec.h:1482)

==31825==    by 0xE13CEE: vec<_edge_var_map, va_heap, vl_ptr>::create(unsigned

int) (vec.h:1497)

==31825==    by 0xE0D5BE: redirect_edge_var_map_add(edge_def*, tree_node*,

tree_node*, unsigned int) (tree-ssa.c:64)

==31825==    by 0xE0D8A5: ssa_redirect_edge(edge_def*, basic_block_def*)

(tree-ssa.c:198)

==31825==    by 0xC7862B: gimple_redirect_edge_and_branch(edge_def*,

basic_block_def*) (tree-cfg.c:5304)

==31825==    by 0x85EC9A: redirect_edge_and_branch(edge_def*, basic_block_def*)

(cfghooks.c:333)

==31825==    by 0xE00E36: ssa_redirect_edges(redirection_data**,

ssa_local_info_t*) (tree-ssa-threadupdate.c:527)

==31825==    by 0xE02F85: void hash_table<redirection_data,

xcallocator>::traverse_noresize<ssa_local_info_t*,

&(ssa_redirect_edges(redirection_data**,

ssa_local_info_t*))>(ssa_local_info_t*) (hash-table.h:859)



Untested fix attached, I think it is a mistake to use a space efficient vector

here (as that means extra heap allocation of void * sized object) and

furthermore the code doesn't care to actually free what it points to.

Reply via email to