+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.
+
2012-08-21 Richard Guenther <rguenther@suse.de>
* alloc-pool.c (pool_alloc): Fix valgrind annotation.
/* 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);
+ var_info_hash, var_info_eq, free);
bitmap_obstack_initialize (&update_ssa_obstack);
}
{
/* 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);
+ 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
}
}
-/* Delete an expr_hash_elt and reclaim its storage. */
+/* Delete variable sized pieces of the expr_hash_elt ELEMENT. */
static void
-free_expr_hash_elt (void *elt)
+free_expr_hash_elt_contents (struct expr_hash_elt *element)
{
- 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)
+ 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);
}
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
slot = htab_find_slot_with_hash (avail_exprs, &element, element.hash,
(insert ? INSERT : NO_INSERT));
if (slot == NULL)
- return NULL_TREE;
-
- 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;
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. */
VEC_free (bitmap, heap, memory_accesses.all_refs_stored_in_loop);
if (memory_accesses.ttae_cache)
- pointer_map_destroy (memory_accesses.ttae_cache);
+ free_affine_expand_cache (&memory_accesses.ttae_cache);
}
/* Moves invariants from loops. Only "expensive" invariants are moved out --