Commit 1fcf52a6 by Jan Hubicka Committed by Jan Hubicka

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
parent 05626b02
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> 2019-10-11 Kewen Lin <linkw@gcc.gnu.org>
* config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): Lower * config/rs6000/rs6000.c (rs6000_builtin_vectorization_cost): Lower
......
...@@ -57,7 +57,7 @@ output_phi (struct output_block *ob, gphi *phi) ...@@ -57,7 +57,7 @@ output_phi (struct output_block *ob, gphi *phi)
/* Emit statement STMT on the main stream of output block OB. */ /* Emit statement STMT on the main stream of output block OB. */
static void 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; unsigned i;
enum gimple_code code; enum gimple_code code;
...@@ -80,7 +80,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt) ...@@ -80,7 +80,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
as_a <gassign *> (stmt)), as_a <gassign *> (stmt)),
1); 1);
bp_pack_value (&bp, gimple_has_volatile_ops (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_value (&bp, hist != NULL, 1);
bp_pack_var_len_unsigned (&bp, stmt->subcode); bp_pack_var_len_unsigned (&bp, stmt->subcode);
...@@ -139,7 +139,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt) ...@@ -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 so that we do not have to deal with type mismatches on
merged symbols during IL read in. The first operand merged symbols during IL read in. The first operand
of GIMPLE_DEBUG must be a decl, not MEM_REF, though. */ 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; basep = &op;
if (TREE_CODE (*basep) == ADDR_EXPR) if (TREE_CODE (*basep) == ADDR_EXPR)
...@@ -147,7 +147,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt) ...@@ -147,7 +147,7 @@ output_gimple_stmt (struct output_block *ob, gimple *stmt)
while (handled_component_p (*basep)) while (handled_component_p (*basep))
basep = &TREE_OPERAND (*basep, 0); basep = &TREE_OPERAND (*basep, 0);
if (VAR_P (*basep) if (VAR_P (*basep)
&& !auto_var_in_fn_p (*basep, current_function_decl) && !auto_var_in_fn_p (*basep, fn->decl)
&& !DECL_REGISTER (*basep)) && !DECL_REGISTER (*basep))
{ {
bool volatilep = TREE_THIS_VOLATILE (*basep); bool volatilep = TREE_THIS_VOLATILE (*basep);
...@@ -228,7 +228,7 @@ output_bb (struct output_block *ob, basic_block bb, struct function *fn) ...@@ -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); 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. */ /* Emit the EH region holding STMT. */
region = lookup_stmt_eh_lp_fn (fn, stmt); region = lookup_stmt_eh_lp_fn (fn, stmt);
......
...@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see
#include "debug.h" #include "debug.h"
#include "omp-offload.h" #include "omp-offload.h"
#include "print-tree.h" #include "print-tree.h"
#include "tree-dfa.h"
static void lto_write_tree (struct output_block*, tree, bool); static void lto_write_tree (struct output_block*, tree, bool);
...@@ -1893,7 +1894,7 @@ output_cfg (struct output_block *ob, struct function *fn) ...@@ -1893,7 +1894,7 @@ output_cfg (struct output_block *ob, struct function *fn)
streamer_write_hwi (ob, -1); streamer_write_hwi (ob, -1);
bb = ENTRY_BLOCK_PTR_FOR_FN (cfun); bb = ENTRY_BLOCK_PTR_FOR_FN (fn);
while (bb->next_bb) while (bb->next_bb)
{ {
streamer_write_hwi (ob, bb->next_bb->index); streamer_write_hwi (ob, bb->next_bb->index);
...@@ -1902,9 +1903,6 @@ output_cfg (struct output_block *ob, struct function *fn) ...@@ -1902,9 +1903,6 @@ output_cfg (struct output_block *ob, struct function *fn)
streamer_write_hwi (ob, -1); streamer_write_hwi (ob, -1);
/* ??? The cfgloop interface is tied to cfun. */
gcc_assert (cfun == fn);
/* Output the number of loops. */ /* Output the number of loops. */
streamer_write_uhwi (ob, number_of_loops (fn)); streamer_write_uhwi (ob, number_of_loops (fn));
...@@ -2062,6 +2060,22 @@ collect_block_tree_leafs (tree root, vec<tree> &leafs) ...@@ -2062,6 +2060,22 @@ collect_block_tree_leafs (tree root, vec<tree> &leafs)
collect_block_tree_leafs (BLOCK_SUBBLOCKS (root), 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. */ /* Output the body of function NODE->DECL. */
static void static void
...@@ -2085,9 +2099,6 @@ output_function (struct cgraph_node *node) ...@@ -2085,9 +2099,6 @@ output_function (struct cgraph_node *node)
gcc_assert (current_function_decl == NULL_TREE && cfun == NULL); 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. */ /* Make string 0 be a NULL string. */
streamer_write_char_stream (ob->string_stream, 0); streamer_write_char_stream (ob->string_stream, 0);
...@@ -2124,9 +2135,6 @@ output_function (struct cgraph_node *node) ...@@ -2124,9 +2135,6 @@ output_function (struct cgraph_node *node)
debug info. */ debug info. */
if (gimple_has_body_p (function)) 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); streamer_write_uhwi (ob, 1);
output_struct_function_base (ob, fn); output_struct_function_base (ob, fn);
...@@ -2143,8 +2151,8 @@ output_function (struct cgraph_node *node) ...@@ -2143,8 +2151,8 @@ output_function (struct cgraph_node *node)
statement numbers. We do not assign UIDs to PHIs here because statement numbers. We do not assign UIDs to PHIs here because
virtual PHIs get re-computed on-the-fly which would make numbers virtual PHIs get re-computed on-the-fly which would make numbers
inconsistent. */ inconsistent. */
set_gimple_stmt_max_uid (cfun, 0); set_gimple_stmt_max_uid (fn, 0);
FOR_ALL_BB_FN (bb, cfun) FOR_ALL_BB_FN (bb, fn)
{ {
for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
gsi_next (&gsi)) gsi_next (&gsi))
...@@ -2153,25 +2161,25 @@ output_function (struct cgraph_node *node) ...@@ -2153,25 +2161,25 @@ output_function (struct cgraph_node *node)
/* Virtual PHIs are not going to be streamed. */ /* Virtual PHIs are not going to be streamed. */
if (!virtual_operand_p (gimple_phi_result (stmt))) 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); for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
gsi_next (&gsi)) gsi_next (&gsi))
{ {
gimple *stmt = gsi_stmt (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 /* To avoid keeping duplicate gimple IDs in the statements, renumber
virtual phis now. */ 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); for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
gsi_next (&gsi)) gsi_next (&gsi))
{ {
gphi *stmt = gsi.phi (); gphi *stmt = gsi.phi ();
if (virtual_operand_p (gimple_phi_result (stmt))) 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) ...@@ -2183,9 +2191,6 @@ output_function (struct cgraph_node *node)
streamer_write_record_start (ob, LTO_null); streamer_write_record_start (ob, LTO_null);
output_cfg (ob, fn); output_cfg (ob, fn);
loop_optimizer_finalize ();
pop_cfun ();
} }
else else
streamer_write_uhwi (ob, 0); streamer_write_uhwi (ob, 0);
......
...@@ -909,6 +909,7 @@ void lto_output_decl_state_refs (struct output_block *, ...@@ -909,6 +909,7 @@ void lto_output_decl_state_refs (struct output_block *,
struct lto_out_decl_state *); struct lto_out_decl_state *);
void lto_output_location (struct output_block *, struct bitpack_d *, location_t); void lto_output_location (struct output_block *, struct bitpack_d *, location_t);
void lto_output_init_mode_table (void); void lto_output_init_mode_table (void);
void lto_prepare_function_for_streaming (cgraph_node *);
/* In lto-cgraph.c */ /* In lto-cgraph.c */
......
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> 2019-10-10 Richard Biener <rguenther@suse.de>
* lto-common.c (unify_scc): Do not merge anonymous NAMESPACE_DECLs. * lto-common.c (unify_scc): Do not merge anonymous NAMESPACE_DECLs.
......
...@@ -304,6 +304,13 @@ lto_wpa_write_files (void) ...@@ -304,6 +304,13 @@ lto_wpa_write_files (void)
timevar_push (TV_WHOPR_WPA_IO); 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. */ /* Generate a prefix for the LTRANS unit files. */
blen = strlen (ltrans_output_list); blen = strlen (ltrans_output_list);
temp_filename = (char *) xmalloc (blen + sizeof ("2147483648.o")); temp_filename = (char *) xmalloc (blen + sizeof ("2147483648.o"));
......
...@@ -2705,20 +2705,12 @@ ipa_write_summaries (void) ...@@ -2705,20 +2705,12 @@ ipa_write_summaries (void)
{ {
struct cgraph_node *node = order[i]; struct cgraph_node *node = order[i];
if (gimple_has_body_p (node->decl)) if (node->definition && node->need_lto_streaming)
{ {
/* When streaming out references to statements as part of some IPA if (gimple_has_body_p (node->decl))
pass summary, the statements need to have uids assigned and the lto_prepare_function_for_streaming (node);
following does that for all the IPA passes here. Naturally, this lto_set_symtab_encoder_in_partition (encoder, node);
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);
} }
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
...@@ -2786,28 +2778,13 @@ void ...@@ -2786,28 +2778,13 @@ void
ipa_write_optimization_summaries (lto_symtab_encoder_t encoder) ipa_write_optimization_summaries (lto_symtab_encoder_t encoder)
{ {
struct lto_out_decl_state *state = lto_new_out_decl_state (); struct lto_out_decl_state *state = lto_new_out_decl_state ();
lto_symtab_encoder_iterator lsei;
state->symtab_node_encoder = encoder; state->symtab_node_encoder = encoder;
lto_output_init_mode_table (); lto_output_init_mode_table ();
lto_push_out_decl_state (state); lto_push_out_decl_state (state);
for (lsei = lsei_start_function_in_partition (encoder);
!lsei_end_p (lsei); lsei_next_function_in_partition (&lsei)) /* Be sure that we did not forget to renumber stmt uids. */
{ gcc_checking_assert (flag_wpa);
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 ();
}
}
gcc_assert (flag_wpa); gcc_assert (flag_wpa);
pass_manager *passes = g->get_passes (); pass_manager *passes = g->get_passes ();
......
...@@ -61,23 +61,23 @@ static void collect_dfa_stats (struct dfa_stats_d *); ...@@ -61,23 +61,23 @@ static void collect_dfa_stats (struct dfa_stats_d *);
/* Renumber all of the gimple stmt uids. */ /* Renumber all of the gimple stmt uids. */
void void
renumber_gimple_stmt_uids (void) renumber_gimple_stmt_uids (struct function *fun)
{ {
basic_block bb; basic_block bb;
set_gimple_stmt_max_uid (cfun, 0); set_gimple_stmt_max_uid (fun, 0);
FOR_ALL_BB_FN (bb, cfun) FOR_ALL_BB_FN (bb, fun)
{ {
gimple_stmt_iterator bsi; gimple_stmt_iterator bsi;
for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi)) for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi); gsi_next (&bsi))
{ {
gimple *stmt = gsi_stmt (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)) for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
{ {
gimple *stmt = gsi_stmt (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));
} }
} }
} }
......
...@@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_TREE_DFA_H #ifndef GCC_TREE_DFA_H
#define 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 renumber_gimple_stmt_uids_in_blocks (basic_block *, int);
extern void dump_variable (FILE *, tree); extern void dump_variable (FILE *, tree);
extern void debug_variable (tree); extern void debug_variable (tree);
......
...@@ -1113,7 +1113,7 @@ pass_dse::execute (function *fun) ...@@ -1113,7 +1113,7 @@ pass_dse::execute (function *fun)
{ {
need_eh_cleanup = BITMAP_ALLOC (NULL); 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 /* We might consider making this a property of each pass so that it
can be [re]computed on an as-needed basis. Particularly since can be [re]computed on an as-needed basis. Particularly since
......
...@@ -3850,7 +3850,7 @@ pass_optimize_widening_mul::execute (function *fun) ...@@ -3850,7 +3850,7 @@ pass_optimize_widening_mul::execute (function *fun)
memset (&widen_mul_stats, 0, sizeof (widen_mul_stats)); memset (&widen_mul_stats, 0, sizeof (widen_mul_stats));
calculate_dominance_info (CDI_DOMINATORS); 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)); math_opts_dom_walker (&cfg_changed).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment