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]

Re: Fix function materialization


On Mon, 17 May 2010, Jan Hubicka wrote:

> 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?

Ok.

Thanks,
Richard.

> 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++;
>  	}
> 
> 

-- 
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex


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