summaryrefslogtreecommitdiff
path: root/gcc/stmt.c
diff options
context:
space:
mode:
authorlauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-05 15:50:41 +0000
committerlauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-05 15:50:41 +0000
commit4527a0e8e1291f9906d009893a42b5c8fcf861e7 (patch)
tree337c3e012e679db345f78cd2066a7fc4cd399987 /gcc/stmt.c
parent31a6f5515208689d806ba079788206ab7558eb9e (diff)
downloadgcc-4527a0e8e1291f9906d009893a42b5c8fcf861e7.tar.gz
2007-09-05 Laurynas Biveinis <laurynas.biveinis@gmail.com>
* Makefile.in (stmt.o): Add alloc-pool.h dependency. * stmt.c: Include alloc-pool.h. (struct case_node): Remove GTY marker. (add_case_node): New parameter case_node_pool. Use it for allocation of r. (expand_case): New allocation pool case_node_pool. Initialize it, pass to add_case_node and free it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128139 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r--gcc/stmt.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 7192dcaf291..69cb5e0b860 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. If not see
#include "optabs.h"
#include "target.h"
#include "regs.h"
+#include "alloc-pool.h"
/* Functions and data structures for expanding case statements. */
@@ -79,7 +80,7 @@ along with GCC; see the file COPYING3. If not see
For very small, suitable switch statements, we can generate a series
of simple bit test and branches instead. */
-struct case_node GTY(())
+struct case_node
{
struct case_node *left; /* Left son in binary tree */
struct case_node *right; /* Right son in binary tree; also node chain */
@@ -121,7 +122,7 @@ static int node_has_high_bound (case_node_ptr, tree);
static int node_is_bounded (case_node_ptr, tree);
static void emit_case_nodes (rtx, case_node_ptr, rtx, tree);
static struct case_node *add_case_node (struct case_node *, tree,
- tree, tree, tree);
+ tree, tree, tree, alloc_pool);
/* Return the rtx-label that corresponds to a LABEL_DECL,
@@ -2067,7 +2068,7 @@ expand_anon_union_decl (tree decl, tree cleanup ATTRIBUTE_UNUSED,
static struct case_node *
add_case_node (struct case_node *head, tree type, tree low, tree high,
- tree label)
+ tree label, alloc_pool case_node_pool)
{
tree min_value, max_value;
struct case_node *r;
@@ -2119,7 +2120,7 @@ add_case_node (struct case_node *head, tree type, tree low, tree high,
/* Add this label to the chain. Make sure to drop overflow flags. */
- r = ggc_alloc (sizeof (struct case_node));
+ r = (struct case_node *) pool_alloc (case_node_pool);
r->low = build_int_cst_wide (TREE_TYPE (low), TREE_INT_CST_LOW (low),
TREE_INT_CST_HIGH (low));
r->high = build_int_cst_wide (TREE_TYPE (high), TREE_INT_CST_LOW (high),
@@ -2322,6 +2323,10 @@ expand_case (tree exp)
/* Label to jump to if no case matches. */
tree default_label_decl;
+ alloc_pool case_node_pool = create_alloc_pool ("struct case_node pool",
+ sizeof (struct case_node),
+ 100);
+
/* The switch body is lowered in gimplify.c, we should never have
switches with a non-NULL SWITCH_BODY here. */
gcc_assert (!SWITCH_BODY (exp));
@@ -2359,7 +2364,7 @@ expand_case (tree exp)
continue;
case_list = add_case_node (case_list, index_type, low, high,
- CASE_LABEL (elt));
+ CASE_LABEL (elt), case_node_pool);
}
@@ -2410,6 +2415,7 @@ expand_case (tree exp)
if (count == 0)
{
emit_jump (default_label);
+ free_alloc_pool (case_node_pool);
return;
}
@@ -2580,6 +2586,7 @@ expand_case (tree exp)
}
free_temp_slots ();
+ free_alloc_pool (case_node_pool);
}
/* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. */