summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/alloc-pool.c11
-rw-r--r--gcc/alloc-pool.h1
-rw-r--r--gcc/dominance.c1
-rw-r--r--gcc/et-forest.c11
-rw-r--r--gcc/et-forest.h1
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 *);
OpenPOWER on IntegriCloud