This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix more leaks
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 21 Aug 2012 12:47:30 +0200 (CEST)
- Subject: [PATCH] Fix more leaks
This fixes a few more heap leaks.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard.
2012-08-21 Richard Guenther <rguenther@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