diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/alloc-pool.c | 11 | ||||
-rw-r--r-- | gcc/alloc-pool.h | 1 | ||||
-rw-r--r-- | gcc/dominance.c | 1 | ||||
-rw-r--r-- | gcc/et-forest.c | 11 | ||||
-rw-r--r-- | gcc/et-forest.h | 1 |
6 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0a56b814167..f0e8292fe75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2006-06-20 Richard Guenther <rguenther@suse.de> + Michael Matz <matz@suse.de> + + * alloc-pool.h (free_alloc_pool_if_empty): Prototype new + function. + * alloc-pool.c (free_alloc_pool_if_empty): New function. + * et-forest.h (et_free_pools): Prototype new function. + * et-forest.c (et_free_tree_force): Free parent occurrence. + (et_free_pools): New function. + * dominance.c (free_dominance_info): Free et-forest alloc + pools. + 2006-06-20 Roger Sayle <roger@eyesopen.com> * expr.c (expand_expr_real_1) <VECTOR_CST>: For vector constants with diff --git a/gcc/alloc-pool.c b/gcc/alloc-pool.c index 17d4073cee5..d85cd9ef57c 100644 --- a/gcc/alloc-pool.c +++ b/gcc/alloc-pool.c @@ -207,6 +207,17 @@ free_alloc_pool (alloc_pool pool) free (pool); } +/* Frees the alloc_pool, if it is empty and zero *POOL in this case. */ +void +free_alloc_pool_if_empty (alloc_pool *pool) +{ + if ((*pool)->elts_free == (*pool)->elts_allocated) + { + free_alloc_pool (*pool); + *pool = NULL; + } +} + /* Allocates one element from the pool specified. */ void * pool_alloc (alloc_pool pool) diff --git a/gcc/alloc-pool.h b/gcc/alloc-pool.h index 5152f9ee458..82188f4c064 100644 --- a/gcc/alloc-pool.h +++ b/gcc/alloc-pool.h @@ -49,6 +49,7 @@ typedef struct alloc_pool_def extern alloc_pool create_alloc_pool (const char *, size_t, size_t); extern void free_alloc_pool (alloc_pool); +extern void free_alloc_pool_if_empty (alloc_pool *); extern void *pool_alloc (alloc_pool); extern void pool_free (alloc_pool, void *); extern void dump_alloc_pool_statistics (void); diff --git a/gcc/dominance.c b/gcc/dominance.c index 92496b77ac1..ca6d1543f77 100644 --- a/gcc/dominance.c +++ b/gcc/dominance.c @@ -663,6 +663,7 @@ free_dominance_info (enum cdi_direction dir) et_free_tree_force (bb->dom[dir]); bb->dom[dir] = NULL; } + et_free_pools (); n_bbs_in_dom_tree[dir] = 0; diff --git a/gcc/et-forest.c b/gcc/et-forest.c index f193afd52d0..b8e55274109 100644 --- a/gcc/et-forest.c +++ b/gcc/et-forest.c @@ -505,9 +505,20 @@ void et_free_tree_force (struct et_node *t) { pool_free (et_occurrences, t->rightmost_occ); + if (t->parent_occ) + pool_free (et_occurrences, t->parent_occ); pool_free (et_nodes, t); } +/* Release the alloc pools, if they are empty. */ + +void +et_free_pools (void) +{ + free_alloc_pool_if_empty (&et_occurrences); + free_alloc_pool_if_empty (&et_nodes); +} + /* Sets father of et tree T to FATHER. */ void diff --git a/gcc/et-forest.h b/gcc/et-forest.h index ccf5aff852c..1de715f40b5 100644 --- a/gcc/et-forest.h +++ b/gcc/et-forest.h @@ -74,6 +74,7 @@ struct et_node struct et_node *et_new_tree (void *data); void et_free_tree (struct et_node *); void et_free_tree_force (struct et_node *); +void et_free_pools (void); void et_set_father (struct et_node *, struct et_node *); void et_split (struct et_node *); struct et_node *et_nca (struct et_node *, struct et_node *); |