[PATCH] Reduce GC walk recursion depth for types

Richard Biener rguenther@suse.de
Wed Mar 19 13:08:00 GMT 2014


This reduces GC walk recursion depth in two ways.

First by re-ordering tree_type_common members to move 'name' last
and 'canonical' before 'next_variant'.  That makes us
first recurse downward (type, pointer_to/reference_to), then
on the same level (canonical, next_variant, main_variant)
and finally upward (context, name->decl_context).
For TS_TYPE_NON_COMMON we still walk down afterwards via values,
on the same level via minval/maxval and upwards via binfo, so
that the patch helps is maybe too  much handwaving?  (but it
helps a reduced testcase without doing the 2nd part)

Second by choosing sth different for chain_next for types
than TREE_CHAIN (which is TYPE_STUB_DECL, no chain at all).
That makes the unreduced testcase work and apart from the issue
below should be obvious enough (though there usually shouldn't
be so many type variants - still if for every type we save
two or three recursions that still helps).

Martin verified this fixes PR60553.

I've changed chain_next only for the LTO frontend as

  while (ggc_test_and_set_mark (xlimit))
   xlimit = (CODE_CONTAINS_STRUCT (TREE_CODE (&(*xlimit).generic), 
TS_TYPE_COMMON) ? ((union lang_tree_node *) 
(*xlimit).generic.type_common.next_variant) : CODE_CONTAINS_STRUCT 
(TREE_CODE (&(*xlimit).generic), TS_COMMON) ? ((union lang_tree_node *) 
(*xlimit).generic.common.chain) : NULL);

likely doesn't create great code ... (note duplicate tree checks
with checking here for other frontends, fixed LTO with the patch
below).

LTO bootstrap running on x86_64-unknown-linux-gnu.

Ok for trunk?

Thanks,
Richard.

2014-03-19  Richard Biener  <rguenther@suse.de>

	PR middle-end/60553
	* tree-core.h (tree_type_common): Re-order pointer members
	to reduce recursion depth during GC walks.

	lto/
	* lto-tree.h (lang_tree_node): For types use TYPE_NEXT_VARIANT 
	instead of TREE_CHAIN as chain_next.

Index: gcc/tree-core.h
===================================================================
--- gcc/tree-core.h	(revision 208642)
+++ gcc/tree-core.h	(working copy)
@@ -1265,11 +1265,11 @@ struct GTY(()) tree_type_common {
     const char * GTY ((tag ("TYPE_SYMTAB_IS_POINTER"))) pointer;
     struct die_struct * GTY ((tag ("TYPE_SYMTAB_IS_DIE"))) die;
   } GTY ((desc ("debug_hooks->tree_type_symtab_field"))) symtab;
-  tree name;
+  tree canonical;
   tree next_variant;
   tree main_variant;
   tree context;
-  tree canonical;
+  tree name;
 };
 
 struct GTY(()) tree_type_with_lang_specific {
Index: gcc/lto/lto-tree.h
===================================================================
--- gcc/lto/lto-tree.h	(revision 208642)
+++ gcc/lto/lto-tree.h	(working copy)
@@ -48,7 +48,7 @@ enum lto_tree_node_structure_enum {
 };
 
 union GTY((desc ("lto_tree_node_structure (&%h)"),
-	  chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
+	  chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_TYPE_COMMON) ? ((union lang_tree_node *) %h.generic.type_common.next_variant) : CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) %h.generic.common.chain) : NULL")))
     lang_tree_node
 {
   union tree_node GTY ((tag ("TS_LTO_GENERIC"),



More information about the Gcc-patches mailing list