From: Jan Hubicka Date: Mon, 24 Dec 2018 01:37:44 +0000 (+0100) Subject: ipa-utils.c (ipa_merge_profiles): Fix updating of fnsummary; also handle rescaling... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=959b8c8257b8b6fa547c25098d1024b53e5f9b45;p=gcc.git ipa-utils.c (ipa_merge_profiles): Fix updating of fnsummary; also handle rescaling of mismatched profiles. * ipa-utils.c (ipa_merge_profiles): Fix updating of fnsummary; also handle rescaling of mismatched profiles. * ipa-fnsummary.c (analyze_function): Handle speculative edges. From-SVN: r267392 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd2a294c583..479083e6483 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-12-24 Jan Hubicka + + * ipa-utils.c (ipa_merge_profiles): Fix updating of fnsummary; + also handle rescaling of mismatched profiles. + * ipa-fnsummary.c (analyze_function): Handle speculative edges. + 2018-12-23 Martin Sebor Jeff Law diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c index 471ec503851..1c43b31104b 100644 --- a/gcc/ipa-fnsummary.c +++ b/gcc/ipa-fnsummary.c @@ -2180,6 +2180,17 @@ analyze_function_body (struct cgraph_node *node, bool early) es->call_stmt_time = this_time; es->loop_depth = bb_loop_depth (bb); edge_set_predicate (edge, &bb_predicate); + if (edge->speculative) + { + cgraph_edge *direct, *indirect; + ipa_ref *ref; + edge->speculative_call_info (direct, indirect, ref); + gcc_assert (direct == edge); + ipa_call_summary *es2 + = ipa_call_summaries->get_create (indirect); + ipa_call_summaries->duplicate (edge, indirect, + es, es2); + } } /* TODO: When conditional jump or swithc is known to be constant, but @@ -2491,7 +2502,8 @@ compute_fn_summary (struct cgraph_node *node, bool early) ipa_update_overall_fn_summary but because computation happens in different order the roundoff errors result in slight changes. */ ipa_update_overall_fn_summary (node); - gcc_assert (info->size == info->self_size); + /* In LTO mode we may have speculative edges set. */ + gcc_assert (in_lto_p || info->size == info->self_size); } diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c index 422d8d09a0e..f07e3b3eecc 100644 --- a/gcc/ipa-utils.c +++ b/gcc/ipa-utils.c @@ -392,6 +392,7 @@ ipa_merge_profiles (struct cgraph_node *dst, if (!src->definition || !dst->definition) return; + if (src->frequency < dst->frequency) src->frequency = dst->frequency; @@ -416,6 +417,8 @@ ipa_merge_profiles (struct cgraph_node *dst, fprintf (symtab->dump_file, "Merging profiles of %s to %s\n", src->dump_name (), dst->dump_name ()); } + profile_count orig_count = dst->count; + if (dst->count.initialized_p () && dst->count.ipa () == dst->count) dst->count += src->count.ipa (); else @@ -644,10 +647,21 @@ ipa_merge_profiles (struct cgraph_node *dst, if (!preserve_body) src->release_body (); /* Update summary. */ - symtab->call_cgraph_removal_hooks (dst); - symtab->call_cgraph_insertion_hooks (dst); + compute_fn_summary (dst, 0); + } + /* We can't update CFG profile, but we can scale IPA profile. CFG + will be scaled according to dst->count after IPA passes. */ + else + { + profile_count to = dst->count; + profile_count::adjust_for_ipa_scaling (&to, &orig_count); + struct cgraph_edge *e; + + for (e = dst->callees; e; e = e->next_callee) + e->count = e->count.apply_scale (to, orig_count); + for (e = dst->indirect_calls; e; e = e->next_callee) + e->count = e->count.apply_scale (to, orig_count); } - /* TODO: if there is no match, we can scale up. */ src->decl = oldsrcdecl; }