This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix function materialization
- From: Richard Guenther <rguenther at suse dot de>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 17 May 2010 11:48:07 +0200 (CEST)
- Subject: Re: Fix function materialization
- References: <20100516230804.GM16915@kam.mff.cuni.cz>
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