This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix function materialization


Hi,
while looking into memory dump I noticed that lto_materialize_function
allocate struct_function in WPA.  We should not need it there, but we
used to touch some of its field.  Allocating empty structure is however
not a good idea.

I also noticed it does more usefull and apparently confused stuff, such as
marking functions as needed, finalizing local statics and such.  All this
should be handled by cgraph code properly.

This drops memory use compiling SPEC2000 GCC to about 20MB of GGC memory
in WPA stage. (that is less that we need for individual units).
DLV sees similar nice savings, now it needs about 40MB.

Bootstrapped/regtested x86_64-linux, OK?

Honza

	* lto.c (lto_materialize_function): Announce function when
	reading body; allocate_struct_function only when reading body;
	do not finalize local statics; ggc_collect after reading;
	do not mark reachable node.
	(materialize_cgraph): Do not announce function.
Index: lto/lto.c
===================================================================
--- lto/lto.c	(revision 159467)
+++ lto/lto.c	(working copy)
@@ -84,7 +84,6 @@ lto_materialize_function (struct cgraph_
   struct lto_file_decl_data *file_data;
   const char *data, *name;
   size_t len;
-  tree step;
 
   /* Ignore clone nodes.  Read the body only from the original one.
      We may find clone nodes during LTRANS after WPA has made inlining
@@ -103,46 +102,33 @@ lto_materialize_function (struct cgraph_
 			       name, &len);
   if (data)
     {
-      struct function *fn;
-
       gcc_assert (!DECL_IS_BUILTIN (decl));
 
       /* This function has a definition.  */
       TREE_STATIC (decl) = 1;
 
       gcc_assert (DECL_STRUCT_FUNCTION (decl) == NULL);
-      allocate_struct_function (decl, false);
 
       /* Load the function body only if not operating in WPA mode.  In
 	 WPA mode, the body of the function is not needed.  */
       if (!flag_wpa)
 	{
+         allocate_struct_function (decl, false);
+	  announce_function (node->decl);
 	  lto_input_function_body (file_data, decl, data);
 	  lto_stats.num_function_bodies++;
 	}
 
-      fn = DECL_STRUCT_FUNCTION (decl);
       lto_free_section_data (file_data, LTO_section_function_body, name,
 			     data, len);
-
-      /* Look for initializers of constant variables and private
-	 statics.  */
-      for (step = fn->local_decls; step; step = TREE_CHAIN (step))
-	{
-	  tree decl = TREE_VALUE (step);
-	  if (TREE_CODE (decl) == VAR_DECL
-	      && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
-	      && flag_unit_at_a_time)
-	    varpool_finalize_decl (decl);
-	}
+      if (!flag_wpa)
+	ggc_collect ();
     }
   else
     DECL_EXTERNAL (decl) = 1;
 
   /* Let the middle end know about the function.  */
   rest_of_decl_compilation (decl, 1, 0);
-  if (cgraph_node (decl)->needed)
-    cgraph_mark_reachable_node (cgraph_node (decl));
 }
 
 
@@ -1686,7 +1671,6 @@ materialize_cgraph (void)
       if (node->local.lto_file_data
           && !DECL_IS_BUILTIN (node->decl))
 	{
-	  announce_function (node->decl);
 	  lto_materialize_function (node);
 	  lto_stats.num_input_cgraph_nodes++;
 	}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]