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

Reply via email to