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.