Patch: make struct case_node in stmt.c use pool instead of GC

Laurynas Biveinis laurynas.biveinis@gmail.com
Tue Sep 4 17:14:00 GMT 2007


Hello,

This is the third and the last for now patch to reduce GC use for
scratch allocation. This patch moves struct case_node from stmt.c
objects to pool. Even though this type has a GTY declaration, is
ineffective, i.e. does not cause a difference in gengtype output. It
should mean, that there is no path from GC roots to any of case_node
objects and that it is not saved in PCH. Thus case_node objects are
pool-allocated now.

Bootstrapped on i686-pc-linux-gnu, no regressions. OK for mainline?

:ADDPATCH middle-end:

2007-09-04  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.

Index: Makefile.in
===================================================================
--- Makefile.in (revision 127998)
+++ Makefile.in (working copy)
@@ -2368,7 +2368,7 @@
    $(TREE_H) $(FLAGS_H) $(FUNCTION_H) insn-config.h hard-reg-set.h $(EXPR_H) \
    libfuncs.h except.h $(RECOG_H) toplev.h output.h $(GGC_H) $(TM_P_H) \
    langhooks.h $(PREDICT_H) $(OPTABS_H) $(TARGET_H) $(MACHMODE_H) \
-   $(REGS_H)
+   $(REGS_H) alloc-pool.h
 except.o : except.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(TREE_H) $(FLAGS_H) except.h $(FUNCTION_H) $(EXPR_H) libfuncs.h \
    langhooks.h insn-config.h hard-reg-set.h $(BASIC_BLOCK_H) output.h \
Index: stmt.c
===================================================================
--- stmt.c      (revision 127998)
+++ stmt.c      (working copy)
@@ -49,6 +49,7 @@
 #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 @@
    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_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 @@

 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 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 @@
   /* 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 @@
            continue;

          case_list = add_case_node (case_list, index_type, low, high,
-                                    CASE_LABEL (elt));
+                                     CASE_LABEL (elt), case_node_pool);
        }


@@ -2553,6 +2558,8 @@
                  = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label));
            }

+          free_alloc_pool (case_node_pool);
+
          /* Fill in the gaps with the default.  */
          for (i = 0; i < ncases; i++)
            if (labelvec[i] == 0)


-- 
Laurynas



More information about the Gcc-patches mailing list