This fixes a few more heap leaks. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard. 2012-08-21 Richard Guenther <rguent...@suse.de> * tree-ssa-loop-im.c (tree_ssa_lim_finalize): Properly free the affine expansion cache. * tree-ssa-dom.c (free_expr_hash_elt_contents): New function, split out from ... (free_expr_hash_elt): ... this one. (record_cond): Properly free a not needed hashtable element. (lookup_avail_expr): Likewise. * tree-into-ssa.c (init_ssa_renamer): Specify a free function for the var_infos hashtable. (update_ssa): Likewise. Index: gcc/tree-ssa-loop-im.c =================================================================== *** gcc/tree-ssa-loop-im.c (revision 190533) --- gcc/tree-ssa-loop-im.c (working copy) *************** tree_ssa_lim_finalize (void) *** 2634,2640 **** VEC_free (bitmap, heap, memory_accesses.all_refs_stored_in_loop); if (memory_accesses.ttae_cache) ! pointer_map_destroy (memory_accesses.ttae_cache); } /* Moves invariants from loops. Only "expensive" invariants are moved out -- --- 2634,2640 ---- VEC_free (bitmap, heap, memory_accesses.all_refs_stored_in_loop); if (memory_accesses.ttae_cache) ! free_affine_expand_cache (&memory_accesses.ttae_cache); } /* Moves invariants from loops. Only "expensive" invariants are moved out -- Index: gcc/tree-ssa-dom.c =================================================================== *** gcc/tree-ssa-dom.c (revision 190533) --- gcc/tree-ssa-dom.c (working copy) *************** print_expr_hash_elt (FILE * stream, cons *** 649,667 **** } } ! /* Delete an expr_hash_elt and reclaim its storage. */ static void ! free_expr_hash_elt (void *elt) { - struct expr_hash_elt *element = ((struct expr_hash_elt *)elt); - if (element->expr.kind == EXPR_CALL) free (element->expr.ops.call.args); ! ! if (element->expr.kind == EXPR_PHI) free (element->expr.ops.phi.args); free (element); } --- 649,672 ---- } } ! /* Delete variable sized pieces of the expr_hash_elt ELEMENT. */ static void ! free_expr_hash_elt_contents (struct expr_hash_elt *element) { if (element->expr.kind == EXPR_CALL) free (element->expr.ops.call.args); ! else if (element->expr.kind == EXPR_PHI) free (element->expr.ops.phi.args); + } + + /* Delete an expr_hash_elt and reclaim its storage. */ + static void + free_expr_hash_elt (void *elt) + { + struct expr_hash_elt *element = ((struct expr_hash_elt *)elt); + free_expr_hash_elt_contents (element); free (element); } *************** lookup_avail_expr (gimple stmt, bool ins *** 2404,2412 **** slot = htab_find_slot_with_hash (avail_exprs, &element, element.hash, (insert ? INSERT : NO_INSERT)); if (slot == NULL) ! return NULL_TREE; ! ! if (*slot == NULL) { struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt); *element2 = element; --- 2409,2419 ---- slot = htab_find_slot_with_hash (avail_exprs, &element, element.hash, (insert ? INSERT : NO_INSERT)); if (slot == NULL) ! { ! free_expr_hash_elt_contents (&element); ! return NULL_TREE; ! } ! else if (*slot == NULL) { struct expr_hash_elt *element2 = XNEW (struct expr_hash_elt); *element2 = element; *************** lookup_avail_expr (gimple stmt, bool ins *** 2422,2427 **** --- 2429,2436 ---- VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, element2); return NULL_TREE; } + else + free_expr_hash_elt_contents (&element); /* Extract the LHS of the assignment so that it can be used as the current definition of another variable. */ Index: gcc/tree-into-ssa.c =================================================================== *** gcc/tree-into-ssa.c (revision 190533) --- gcc/tree-into-ssa.c (working copy) *************** init_ssa_renamer (void) *** 2291,2297 **** /* Allocate memory for the DEF_BLOCKS hash table. */ gcc_assert (var_infos == NULL); var_infos = htab_create (VEC_length (tree, cfun->local_decls), ! var_info_hash, var_info_eq, NULL); bitmap_obstack_initialize (&update_ssa_obstack); } --- 2291,2297 ---- /* Allocate memory for the DEF_BLOCKS hash table. */ gcc_assert (var_infos == NULL); var_infos = htab_create (VEC_length (tree, cfun->local_decls), ! var_info_hash, var_info_eq, free); bitmap_obstack_initialize (&update_ssa_obstack); } *************** update_ssa (unsigned update_flags) *** 3170,3176 **** { /* If we rename bare symbols initialize the mapping to auxiliar info we need to keep track of. */ ! var_infos = htab_create (47, var_info_hash, var_info_eq, NULL); /* If we have to rename some symbols from scratch, we need to start the process at the root of the CFG. FIXME, it should --- 3170,3176 ---- { /* If we rename bare symbols initialize the mapping to auxiliar info we need to keep track of. */ ! var_infos = htab_create (47, var_info_hash, var_info_eq, free); /* If we have to rename some symbols from scratch, we need to start the process at the root of the CFG. FIXME, it should Index: gcc/tree-ssa-dom.c =================================================================== --- gcc/tree-ssa-dom.c (revision 190529) +++ gcc/tree-ssa-dom.c (working copy) @@ -1203,7 +1203,7 @@ record_cond (cond_equivalence *p) VEC_safe_push (expr_hash_elt_t, heap, avail_exprs_stack, element); } else - free (element); + free_expr_hash_elt (element); } /* Build a cond_equivalence record indicating that the comparison