Do not allocate ggc during streaming.

* gimple-streamer-out.c (output_gimple_stmt): Add explicit function
	parameter.
	* lto-streamer-out.c: Include tree-dfa.h.
	(output_cfg): Do not use cfun.
	(lto_prepare_function_for_streaming): New.
	(output_function): Do not push cfun; do not initialize loop optimizer.
	* lto-streamer.h (lto_prepare_function_for_streaming): Declare.
	* passes.c (ipa_write_summaries): Use it.
	(ipa_write_optimization_summaries): Do not modify bodies.
	* tree-dfa.c (renumber_gimple_stmt_uids): Add function parameter.
	* tree.dfa.h (renumber_gimple_stmt_uids): Update prototype.
	* tree-ssa-dse.c (pass_dse::execute): Update use of
	renumber_gimple_stmt_uids.
	* tree-ssa-math-opts.c (pass_optimize_widening_mul::execute): Likewise.

	* lto.c (lto_wpa_write_files): Prepare all bodies for streaming.

From-SVN: r276870
This commit is contained in:
Jan Hubicka 2019-10-11 10:59:16 +02:00 committed by Jan Hubicka
parent 05626b02e8
commit 1fcf52a6a2
11 changed files with 73 additions and 62 deletions

View File

@ -1,3 +1,20 @@
2019-10-11 Jan Hubicka <hubicka@ucw.cz>
* gimple-streamer-out.c (output_gimple_stmt): Add explicit function
parameter.
* lto-streamer-out.c: Include tree-dfa.h.
(output_cfg): Do not use cfun.
(lto_prepare_function_for_streaming): New.
(output_function): Do not push cfun; do not initialize loop optimizer.
* lto-streamer.h (lto_prepare_function_for_streaming): Declare.
* passes.c (ipa_write_summaries): Use it.
(ipa_write_optimization_summaries): Do not modify bodies.
* tree-dfa.c (renumber_gimple_stmt_uids): Add function parameter.
* tree.dfa.h (renumber_gimple_stmt_uids): Update prototype.
* tree-ssa-dse.c (pass_dse::execute): Update use of
renumber_gimple_stmt_uids.
* tree-ssa-math-opts.c (pass_optimize_widening_mul::execute): Likewise.
2019-10-11 Kewen Lin <linkw@gcc.gnu.org>
* config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): Lower

View File

@ -57,7 +57,7 @@ output_phi (struct output_block *ob, gphi *phi)
/* Emit statement STMT on the main stream of output block OB. */
static void
output_gimple_stmt (struct output_block *ob, gimple *stmt)
output_gimple_stmt (struct output_block *ob, struct function *fn, gimple *stmt)
{
unsigned i;
enum gimple_code code;
@ -80,7 +80,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
as_a <gassign *> (stmt)),
1);
bp_pack_value (&bp, gimple_has_volatile_ops (stmt), 1);
hist = gimple_histogram_value (cfun, stmt);
hist = gimple_histogram_value (fn, stmt);
bp_pack_value (&bp, hist != NULL, 1);
bp_pack_var_len_unsigned (&bp, stmt->subcode);
@ -139,7 +139,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
so that we do not have to deal with type mismatches on
merged symbols during IL read in. The first operand
of GIMPLE_DEBUG must be a decl, not MEM_REF, though. */
if (op && (i || !is_gimple_debug (stmt)))
if (!flag_wpa && op && (i || !is_gimple_debug (stmt)))
{
basep = &op;
if (TREE_CODE (*basep) == ADDR_EXPR)
@ -147,7 +147,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
while (handled_component_p (*basep))
basep = &TREE_OPERAND (*basep, 0);
if (VAR_P (*basep)
&& !auto_var_in_fn_p (*basep, current_function_decl)
&& !auto_var_in_fn_p (*basep, fn->decl)
&& !DECL_REGISTER (*basep))
{
bool volatilep = TREE_THIS_VOLATILE (*basep);
@ -228,7 +228,7 @@ output_bb (struct output_block *ob, basic_block bb, struct function *fn)
print_gimple_stmt (streamer_dump_file, stmt, 0, TDF_SLIM);
}
output_gimple_stmt (ob, stmt);
output_gimple_stmt (ob, fn, stmt);
/* Emit the EH region holding STMT. */
region = lookup_stmt_eh_lp_fn (fn, stmt);

View File

@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see
#include "debug.h"
#include "omp-offload.h"
#include "print-tree.h"
#include "tree-dfa.h"
static void lto_write_tree (struct output_block*, tree, bool);
@ -1893,7 +1894,7 @@ output_cfg (struct output_block *ob, struct function *fn)
streamer_write_hwi (ob, -1);
bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
while (bb->next_bb)
{
streamer_write_hwi (ob, bb->next_bb->index);
@ -1902,9 +1903,6 @@ output_cfg (struct output_block *ob, struct function *fn)
streamer_write_hwi (ob, -1);
/* ??? The cfgloop interface is tied to cfun. */
gcc_assert (cfun == fn);
/* Output the number of loops. */
streamer_write_uhwi (ob, number_of_loops (fn));
@ -2062,6 +2060,22 @@ collect_block_tree_leafs (tree root, vec<tree> &leafs)
collect_block_tree_leafs (BLOCK_SUBBLOCKS (root), leafs);
}
/* This performs function body modifications that are needed for streaming
to work. */
void
lto_prepare_function_for_streaming (struct cgraph_node *node)
{
if (number_of_loops (DECL_STRUCT_FUNCTION (node->decl)))
{
push_cfun (DECL_STRUCT_FUNCTION (node->decl));
loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
loop_optimizer_finalize ();
pop_cfun ();
}
renumber_gimple_stmt_uids (DECL_STRUCT_FUNCTION (node->decl));
}
/* Output the body of function NODE->DECL. */
static void
@ -2085,9 +2099,6 @@ output_function (struct cgraph_node *node)
gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
/* Set current_function_decl and cfun. */
push_cfun (fn);
/* Make string 0 be a NULL string. */
streamer_write_char_stream (ob->string_stream, 0);
@ -2124,9 +2135,6 @@ output_function (struct cgraph_node *node)
debug info. */
if (gimple_has_body_p (function))
{
/* Fixup loops if required to match discovery done in the reader. */
loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
streamer_write_uhwi (ob, 1);
output_struct_function_base (ob, fn);
@ -2143,8 +2151,8 @@ output_function (struct cgraph_node *node)
statement numbers. We do not assign UIDs to PHIs here because
virtual PHIs get re-computed on-the-fly which would make numbers
inconsistent. */
set_gimple_stmt_max_uid (cfun, 0);
FOR_ALL_BB_FN (bb, cfun)
set_gimple_stmt_max_uid (fn, 0);
FOR_ALL_BB_FN (bb, fn)
{
for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
gsi_next (&gsi))
@ -2153,25 +2161,25 @@ output_function (struct cgraph_node *node)
/* Virtual PHIs are not going to be streamed. */
if (!virtual_operand_p (gimple_phi_result (stmt)))
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
}
for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
gsi_next (&gsi))
{
gimple *stmt = gsi_stmt (gsi);
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
}
}
/* To avoid keeping duplicate gimple IDs in the statements, renumber
virtual phis now. */
FOR_ALL_BB_FN (bb, cfun)
FOR_ALL_BB_FN (bb, fn)
{
for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
gsi_next (&gsi))
{
gphi *stmt = gsi.phi ();
if (virtual_operand_p (gimple_phi_result (stmt)))
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fn));
}
}
@ -2183,9 +2191,6 @@ output_function (struct cgraph_node *node)
streamer_write_record_start (ob, LTO_null);
output_cfg (ob, fn);
loop_optimizer_finalize ();
pop_cfun ();
}
else
streamer_write_uhwi (ob, 0);

View File

@ -909,6 +909,7 @@ void lto_output_decl_state_refs (struct output_block *,
struct lto_out_decl_state *);
void lto_output_location (struct output_block *, struct bitpack_d *, location_t);
void lto_output_init_mode_table (void);
void lto_prepare_function_for_streaming (cgraph_node *);
/* In lto-cgraph.c */

View File

@ -1,3 +1,7 @@
2019-10-11 Jan Hubicka <hubicka@ucw.cz>
* lto.c (lto_wpa_write_files): Prepare all bodies for streaming.
2019-10-10 Richard Biener <rguenther@suse.de>
* lto-common.c (unify_scc): Do not merge anonymous NAMESPACE_DECLs.

View File

@ -304,6 +304,13 @@ lto_wpa_write_files (void)
timevar_push (TV_WHOPR_WPA_IO);
cgraph_node *node;
/* Do body modifications needed for streaming before we fork out
worker processes. */
FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
if (gimple_has_body_p (node->decl))
lto_prepare_function_for_streaming (node);
/* Generate a prefix for the LTRANS unit files. */
blen = strlen (ltrans_output_list);
temp_filename = (char *) xmalloc (blen + sizeof ("2147483648.o"));

View File

@ -2705,20 +2705,12 @@ ipa_write_summaries (void)
{
struct cgraph_node *node = order[i];
if (gimple_has_body_p (node->decl))
{
/* When streaming out references to statements as part of some IPA
pass summary, the statements need to have uids assigned and the
following does that for all the IPA passes here. Naturally, this
ordering then matches the one IPA-passes get in their stmt_fixup
hooks. */
push_cfun (DECL_STRUCT_FUNCTION (node->decl));
renumber_gimple_stmt_uids ();
pop_cfun ();
}
if (node->definition && node->need_lto_streaming)
lto_set_symtab_encoder_in_partition (encoder, node);
{
if (gimple_has_body_p (node->decl))
lto_prepare_function_for_streaming (node);
lto_set_symtab_encoder_in_partition (encoder, node);
}
}
FOR_EACH_DEFINED_FUNCTION (node)
@ -2786,28 +2778,13 @@ void
ipa_write_optimization_summaries (lto_symtab_encoder_t encoder)
{
struct lto_out_decl_state *state = lto_new_out_decl_state ();
lto_symtab_encoder_iterator lsei;
state->symtab_node_encoder = encoder;
lto_output_init_mode_table ();
lto_push_out_decl_state (state);
for (lsei = lsei_start_function_in_partition (encoder);
!lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
{
struct cgraph_node *node = lsei_cgraph_node (lsei);
/* When streaming out references to statements as part of some IPA
pass summary, the statements need to have uids assigned.
For functions newly born at WPA stage we need to initialize
the uids here. */
if (node->definition
&& gimple_has_body_p (node->decl))
{
push_cfun (DECL_STRUCT_FUNCTION (node->decl));
renumber_gimple_stmt_uids ();
pop_cfun ();
}
}
/* Be sure that we did not forget to renumber stmt uids. */
gcc_checking_assert (flag_wpa);
gcc_assert (flag_wpa);
pass_manager *passes = g->get_passes ();

View File

@ -61,23 +61,23 @@ static void collect_dfa_stats (struct dfa_stats_d *);
/* Renumber all of the gimple stmt uids. */
void
renumber_gimple_stmt_uids (void)
renumber_gimple_stmt_uids (struct function *fun)
{
basic_block bb;
set_gimple_stmt_max_uid (cfun, 0);
FOR_ALL_BB_FN (bb, cfun)
set_gimple_stmt_max_uid (fun, 0);
FOR_ALL_BB_FN (bb, fun)
{
gimple_stmt_iterator bsi;
for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
{
gimple *stmt = gsi_stmt (bsi);
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun));
}
for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
{
gimple *stmt = gsi_stmt (bsi);
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
gimple_set_uid (stmt, inc_gimple_stmt_max_uid (fun));
}
}
}

View File

@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_TREE_DFA_H
#define GCC_TREE_DFA_H
extern void renumber_gimple_stmt_uids (void);
extern void renumber_gimple_stmt_uids (struct function *);
extern void renumber_gimple_stmt_uids_in_blocks (basic_block *, int);
extern void dump_variable (FILE *, tree);
extern void debug_variable (tree);

View File

@ -1113,7 +1113,7 @@ pass_dse::execute (function *fun)
{
need_eh_cleanup = BITMAP_ALLOC (NULL);
renumber_gimple_stmt_uids ();
renumber_gimple_stmt_uids (cfun);
/* We might consider making this a property of each pass so that it
can be [re]computed on an as-needed basis. Particularly since

View File

@ -3850,7 +3850,7 @@ pass_optimize_widening_mul::execute (function *fun)
memset (&widen_mul_stats, 0, sizeof (widen_mul_stats));
calculate_dominance_info (CDI_DOMINATORS);
renumber_gimple_stmt_uids ();
renumber_gimple_stmt_uids (cfun);
math_opts_dom_walker (&cfg_changed).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));