This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix function materialization
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, rguenther at suse dot de
- Date: Mon, 17 May 2010 01:08:04 +0200
- Subject: 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++;
}