From 7237f93eb3aaecb27800ce1688ece4c4cbcb790b Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 4 Nov 2019 15:07:09 +0100 Subject: [PATCH] cgraphclones.c (cgraph_node::create_version_clone): Do not duplicate summaries. * cgraphclones.c (cgraph_node::create_version_clone): Do not duplicate summaries. * ipa-fnsummary.c (ipa_fn_summary_alloc): Allocate size summary first. (ipa_fn_summary_t::duplicate): Use get instead of get_create to access call summaries. (dump_ipa_call_summary): Be ready for missing edge summaries. (analyze_function_body): Use get instead of get_create to access edge summary. (estimate_calls_size_and_time): Do not access summaries of inlined edges; sanity check they are missing. (ipa_call_context::estimate_size_and_time): Use get instead of get_create to access node summary. (inline_update_callee_summaries): Do not update depth of inlined edge. (ipa_merge_fn_summary_after_inlining): Remove inline edge from growth caches. (ipa_merge_fn_summary_after_inlining): Use get instead of get_create. * ipa-fnsummary.h (ipa_remove_from_growth_caches): Declare. * ipa-inline-analyssi.c (edge_growth_cache): Turn to fast summary. (initialize_growth_caches): Update. (do_estimate_edge_time): Remove redundant copy of context. (ipa_remove_from_growth_caches): New function. * ipa-inline.c (flatten_function): Update overall summary only when optimizing. (inline_to_all_callers): Update overall summary of function inlined to. * ipa-inline.h (edge_growth_cache): Turn to fast summary. * symbol-summary.h (call_summary_base): Set m_initialize_when_cloning to false. From-SVN: r277780 --- gcc/ChangeLog | 35 ++++++++++++++++++++ gcc/cgraphclones.c | 2 -- gcc/ipa-fnsummary.c | 70 +++++++++++++++++++++------------------ gcc/ipa-fnsummary.h | 1 + gcc/ipa-inline-analysis.c | 15 +++++++-- gcc/ipa-inline.c | 8 ++--- gcc/ipa-inline.h | 2 +- gcc/symbol-summary.h | 2 +- 8 files changed, 92 insertions(+), 43 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b53c793d6c2..a9222a8deaf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,38 @@ +2019-11-04 Jan Hubicka + + * cgraphclones.c (cgraph_node::create_version_clone): Do not + duplicate summaries. + * ipa-fnsummary.c (ipa_fn_summary_alloc): Allocate size summary + first. + (ipa_fn_summary_t::duplicate): Use get instead of get_create to + access call summaries. + (dump_ipa_call_summary): Be ready for missing edge summaries. + (analyze_function_body): Use get instead of get_create to access + edge summary. + (estimate_calls_size_and_time): Do not access summaries of + inlined edges; sanity check they are missing. + (ipa_call_context::estimate_size_and_time): Use get instead + of get_create to access node summary. + (inline_update_callee_summaries): Do not update depth of + inlined edge. + (ipa_merge_fn_summary_after_inlining): Remove inline edge from + growth caches. + (ipa_merge_fn_summary_after_inlining): Use get instead + of get_create. + * ipa-fnsummary.h (ipa_remove_from_growth_caches): Declare. + * ipa-inline-analyssi.c (edge_growth_cache): Turn to + fast summary. + (initialize_growth_caches): Update. + (do_estimate_edge_time): Remove redundant copy of context. + (ipa_remove_from_growth_caches): New function. + * ipa-inline.c (flatten_function): Update overall summary + only when optimizing. + (inline_to_all_callers): Update overall summary of function + inlined to. + * ipa-inline.h (edge_growth_cache): Turn to fast summary. + * symbol-summary.h (call_summary_base): Set m_initialize_when_cloning + to false. + 2019-11-04 Richard Biener * system.h: Include malloc.h if INCLUDE_MALLOC_H and HAVE_MALLINFO. diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 726e31e17f7..b0dc3722293 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -892,8 +892,6 @@ cgraph_node::create_version_clone (tree new_decl, e->redirect_callee (new_version); } - symtab->call_cgraph_duplication_hooks (this, new_version); - dump_callgraph_transformation (this, new_version, suffix); return new_version; diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c index 72a01cff6c9..64c4d95ccd4 100644 --- a/gcc/ipa-fnsummary.c +++ b/gcc/ipa-fnsummary.c @@ -553,9 +553,9 @@ static void ipa_fn_summary_alloc (void) { gcc_checking_assert (!ipa_fn_summaries); - ipa_fn_summaries = ipa_fn_summary_t::create_ggc (symtab); ipa_size_summaries = new fast_function_summary (symtab); + ipa_fn_summaries = ipa_fn_summary_t::create_ggc (symtab); ipa_call_summaries = new ipa_call_summary_t (symtab); } @@ -688,7 +688,7 @@ ipa_fn_summary_t::duplicate (cgraph_node *src, for (edge = dst->callees; edge; edge = next) { predicate new_predicate; - class ipa_call_summary *es = ipa_call_summaries->get_create (edge); + class ipa_call_summary *es = ipa_call_summaries->get (edge); next = edge->next_callee; if (!edge->inline_failed) @@ -707,7 +707,7 @@ ipa_fn_summary_t::duplicate (cgraph_node *src, for (edge = dst->indirect_calls; edge; edge = next) { predicate new_predicate; - class ipa_call_summary *es = ipa_call_summaries->get_create (edge); + class ipa_call_summary *es = ipa_call_summaries->get (edge); next = edge->next_callee; gcc_checking_assert (edge->inline_failed); @@ -787,12 +787,15 @@ dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node, int i; fprintf (f, - "%*s%s/%i %s\n%*s loop depth:%2i freq:%4.2f size:%2i time: %2i", + "%*s%s/%i %s\n%*s freq:%4.2f", indent, "", callee->name (), callee->order, !edge->inline_failed ? "inlined" : cgraph_inline_failed_string (edge-> inline_failed), - indent, "", es->loop_depth, edge->sreal_frequency ().to_double (), - es->call_stmt_size, es->call_stmt_time); + indent, "", edge->sreal_frequency ().to_double ()); + + if (es) + fprintf (f, " loop depth:%2i size:%2i time: %2i", + es->loop_depth, es->call_stmt_size, es->call_stmt_time); ipa_fn_summary *s = ipa_fn_summaries->get (callee); ipa_size_summary *ss = ipa_size_summaries->get (callee); @@ -801,14 +804,14 @@ dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node, (int) (ss->size / ipa_fn_summary::size_scale), (int) s->estimated_stack_size); - if (es->predicate) + if (es && es->predicate) { fprintf (f, " predicate: "); es->predicate->dump (f, info->conds); } else fprintf (f, "\n"); - if (es->param.exists ()) + if (es && es->param.exists ()) for (i = 0; i < (int) es->param.length (); i++) { int prob = es->param[i].change_prob; @@ -2480,7 +2483,7 @@ analyze_function_body (struct cgraph_node *node, bool early) edge->speculative_call_info (direct, indirect, ref); gcc_assert (direct == edge); ipa_call_summary *es2 - = ipa_call_summaries->get_create (indirect); + = ipa_call_summaries->get (indirect); ipa_call_summaries->duplicate (edge, indirect, es, es2); } @@ -2924,10 +2927,20 @@ estimate_calls_size_and_time (struct cgraph_node *node, int *size, struct cgraph_edge *e; for (e = node->callees; e; e = e->next_callee) { - class ipa_call_summary *es = ipa_call_summaries->get_create (e); + if (!e->inline_failed) + { + gcc_checking_assert (!ipa_call_summaries->get (e)); + estimate_calls_size_and_time (e->callee, size, min_size, time, + hints, + possible_truths, + known_vals, known_contexts, + known_aggs); + continue; + } + class ipa_call_summary *es = ipa_call_summaries->get (e); /* Do not care about zero sized builtins. */ - if (e->inline_failed && !es->call_stmt_size) + if (!es->call_stmt_size) { gcc_checking_assert (!es->call_stmt_time); continue; @@ -2935,27 +2948,18 @@ estimate_calls_size_and_time (struct cgraph_node *node, int *size, if (!es->predicate || es->predicate->evaluate (possible_truths)) { - if (e->inline_failed) - { - /* Predicates of calls shall not use NOT_CHANGED codes, - sowe do not need to compute probabilities. */ - estimate_edge_size_and_time (e, size, - es->predicate ? NULL : min_size, - time, REG_BR_PROB_BASE, - known_vals, known_contexts, - known_aggs, hints); - } - else - estimate_calls_size_and_time (e->callee, size, min_size, time, - hints, - possible_truths, - known_vals, known_contexts, - known_aggs); + /* Predicates of calls shall not use NOT_CHANGED codes, + sowe do not need to compute probabilities. */ + estimate_edge_size_and_time (e, size, + es->predicate ? NULL : min_size, + time, REG_BR_PROB_BASE, + known_vals, known_contexts, + known_aggs, hints); } } for (e = node->indirect_calls; e; e = e->next_callee) { - class ipa_call_summary *es = ipa_call_summaries->get_create (e); + class ipa_call_summary *es = ipa_call_summaries->get (e); if (!es->predicate || es->predicate->evaluate (possible_truths)) estimate_edge_size_and_time (e, size, @@ -3204,7 +3208,7 @@ ipa_call_context::estimate_size_and_time (int *ret_size, sreal *ret_nonspecialized_time, ipa_hints *ret_hints) { - class ipa_fn_summary *info = ipa_fn_summaries->get_create (m_node); + class ipa_fn_summary *info = ipa_fn_summaries->get (m_node); size_time_entry *e; int size = 0; sreal time = 0; @@ -3382,7 +3386,8 @@ inline_update_callee_summaries (struct cgraph_node *node, int depth) { if (!e->inline_failed) inline_update_callee_summaries (e->callee, depth); - ipa_call_summaries->get (e)->loop_depth += depth; + else + ipa_call_summaries->get (e)->loop_depth += depth; } for (e = node->indirect_calls; e; e = e->next_callee) ipa_call_summaries->get (e)->loop_depth += depth; @@ -3649,6 +3654,7 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge) /* Free summaries that are not maintained for inline clones/edges. */ ipa_call_summaries->remove (edge); ipa_fn_summaries->remove (edge->callee); + ipa_remove_from_growth_caches (edge); } /* For performance reasons ipa_merge_fn_summary_after_inlining is not updating @@ -3657,8 +3663,8 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge) void ipa_update_overall_fn_summary (struct cgraph_node *node) { - class ipa_fn_summary *info = ipa_fn_summaries->get_create (node); - class ipa_size_summary *size_info = ipa_size_summaries->get_create (node); + class ipa_fn_summary *info = ipa_fn_summaries->get (node); + class ipa_size_summary *size_info = ipa_size_summaries->get (node); size_time_entry *e; int i; diff --git a/gcc/ipa-fnsummary.h b/gcc/ipa-fnsummary.h index 91488a99881..8f9eaf560ac 100644 --- a/gcc/ipa-fnsummary.h +++ b/gcc/ipa-fnsummary.h @@ -364,5 +364,6 @@ void evaluate_properties_for_edge (struct cgraph_edge *e, void ipa_fnsummary_c_finalize (void); HOST_WIDE_INT ipa_get_stack_frame_offset (struct cgraph_node *node); +void ipa_remove_from_growth_caches (struct cgraph_edge *edge); #endif /* GCC_IPA_FNSUMMARY_H */ diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 436310596ac..ea1fae484ff 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -51,7 +51,7 @@ along with GCC; see the file COPYING3. If not see #include "gimplify.h" /* Cached node/edge growths. */ -call_summary *edge_growth_cache = NULL; +fast_call_summary *edge_growth_cache = NULL; /* The context cache remembers estimated time/size and hints for given ipa_call_context of a call. */ @@ -125,7 +125,7 @@ void initialize_growth_caches () { edge_growth_cache - = new call_summary (symtab, false); + = new fast_call_summary (symtab); node_context_cache = new fast_function_summary (symtab); } @@ -219,7 +219,6 @@ do_estimate_edge_time (struct cgraph_edge *edge) else node_context_cache_clear++; e->entry.ctx.release (true); - e->entry.ctx = ctx; ctx.estimate_size_and_time (&size, &min_size, &time, &nonspec_time, &hints); e->entry.size = size; @@ -275,6 +274,16 @@ reset_node_cache (struct cgraph_node *node) node_context_cache->remove (node); } +/* Remove EDGE from caches once it was inlined. */ +void +ipa_remove_from_growth_caches (struct cgraph_edge *edge) +{ + if (node_context_cache) + node_context_cache->remove (edge->callee); + if (edge_growth_cache) + edge_growth_cache->remove (edge); +} + /* Return estimated callee growth after inlining EDGE. Only to be called via estimate_edge_size. */ diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index dacec7d401b..b2c90cc2dd9 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -2290,9 +2290,9 @@ flatten_function (struct cgraph_node *node, bool early, bool update) } node->aux = NULL; - if (update) - ipa_update_overall_fn_summary (node->inlined_to - ? node->inlined_to : node); + cgraph_node *where = node->inlined_to ? node->inlined_to : node; + if (update && opt_for_fn (where->decl, optimize)) + ipa_update_overall_fn_summary (where); } /* Inline NODE to all callers. Worker for cgraph_for_node_and_aliases. @@ -2367,7 +2367,7 @@ inline_to_all_callers (struct cgraph_node *node, void *data) we have a lot of calls to the same function. */ for (hash_set::iterator i = callers.begin (); i != callers.end (); ++i) - ipa_update_overall_fn_summary (*i); + ipa_update_overall_fn_summary ((*i)->inlined_to ? (*i)->inlined_to : *i); return res; } diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h index 7675b9e08fa..33205a0e6db 100644 --- a/gcc/ipa-inline.h +++ b/gcc/ipa-inline.h @@ -39,7 +39,7 @@ public: hints (hints) {} }; -extern call_summary *edge_growth_cache; +extern fast_call_summary *edge_growth_cache; /* In ipa-inline-analysis.c */ int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *); diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h index 14da3a14c3c..f677f16e0ce 100644 --- a/gcc/symbol-summary.h +++ b/gcc/symbol-summary.h @@ -532,7 +532,7 @@ class call_summary_base public: /* Default construction takes SYMTAB as an argument. */ call_summary_base (symbol_table *symtab): m_symtab (symtab), - m_initialize_when_cloning (true) + m_initialize_when_cloning (false) {} /* Basic implementation of removal operation. */ -- 2.30.2