diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2017-11-10 21:14:52 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2017-11-10 20:14:52 +0000 |
commit | 1bad9c1806ac51abc2bf1bdf18b96924b1104ebb (patch) | |
tree | fb0b29c9c3b3f1661c40c33d122103cfc6a499c1 /gcc/cgraphclones.c | |
parent | a0e6ac44380249e8dfa4e6e4c533edfc6ad46d5b (diff) | |
download | gcc-1bad9c1806ac51abc2bf1bdf18b96924b1104ebb.zip gcc-1bad9c1806ac51abc2bf1bdf18b96924b1104ebb.tar.gz gcc-1bad9c1806ac51abc2bf1bdf18b96924b1104ebb.tar.bz2 |
auto-profile.c (afdo_indirect_call): Drop frequency.
* auto-profile.c (afdo_indirect_call): Drop frequency.
* cgraph.c (symbol_table::create_edge): Drop frequency argument.
(cgraph_node::create_edge): Drop frequency argument.
(cgraph_node::create_indirect_edge): Drop frequency argument.
(cgraph_edge::make_speculative): Drop frequency arguments.
(cgraph_edge::resolve_speculation): Do not update frequencies
(cgraph_edge::dump_edge_flags): Do not dump frequency.
(cgraph_node::dump): Check consistency in IPA mode.
(cgraph_edge::maybe_hot_p): Use IPA counter.
(cgraph_edge::verify_count_and_frequency): Rename to ...
(cgraph_edge::verify_count): ... this one; drop frequency checking.
(cgraph_node::verify_node): Update.
* cgraph.h (struct cgraph_edge): Drop frequency.
(cgraph_edge::frequency): New function.
* cgraphbuild.c (pass_build_cgraph_edges::execute): Donot pass
frequencies.
(cgraph_edge::rebuild_edges): Likewise.
* cgraphclones.c (cgraph_edge::clone): Scale only counts.
(duplicate_thunk_for_node): Do not pass frequency.
(cgraph_node::create_clone): Scale only counts.
(cgraph_node::create_virtual_clone): Do not pass frequency.
(cgraph_node::create_edge_including_clones): Do not pass frequency.
(cgraph_node::create_version_clone): Do not pass frequency.
* cgraphunit.c (cgraph_node::analyze): Do not pass frequency.
(cgraph_node::expand_thunk): Do not pass frequency.
(cgraph_node::create_wrapper): Do not pass frequency.
* gimple-iterator.c (update_call_edge_frequencies): Do not pass
frequency.
* gimple-streamer-in.c (input_bb): Scale only IPA counts.
* ipa-chkp.c (chkp_produce_thunks): Do not pass frequency.
* ipa-cp.c (ipcp_lattice::print): Use frequency function.
(gather_caller_stats): Use frequency function.
(ipcp_cloning_candidate_p): Use frequency function.
(ipcp_propagate_stage): Use frequency function.
(get_info_about_necessary_edges): Use frequency function.
(update_profiling_info): Update only IPA profile.
(update_specialized_profile): Use frequency functoin.
(perhaps_add_new_callers): Update only IPA profile.
* ipa-devirt.c (ipa_devirt): Use IPA profile.
* ipa-fnsummary.c (redirect_to_unreachable): Do not set frequrency.
(dump_ipa_call_summary): Use frequency function.
(estimate_edge_size_and_time): Use frequency function.
(ipa_merge_fn_summary_after_inlining): Use frequency function.
* ipa-inline-analysis.c (do_estimate_edge_time): Use IPA profile.
* ipa-inline-transform.c (update_noncloned_frequencies): Rename to ..
(update_noncloned_counts): ... ths one; scale counts only.
(clone_inlined_nodes): Do not scale frequency.
(inline_call): Do not pass frequency.
* ipa-inline.c (compute_uninlined_call_time): Use IPA profile.
(compute_inlined_call_time): Use IPA profile.
(want_inline_small_function_p): Use IPA profile.
(want_inline_self_recursive_call_p): Use IPA profile.
(edge_badness): Use IPA profile.
(lookup_recursive_calls): Use IPA profile.
(recursive_inlining): Do not pass frequency.
(resolve_noninline_speculation): Do not update frequency.
(inline_small_functions): Collect max of IPA profile.
(dump_overall_stats): Dump IPA porfile.
(dump_inline_stats): Dump IPA porfile.
(ipa_inline): Collect IPA stats.
* ipa-inline.h (clone_inlined_nodes): Update prototype.
* ipa-profile.c (ipa_propagate_frequency_1): Use frequency function.
(ipa_propagate_frequency): Use frequency function.
(ipa_profile): Cleanup.
* ipa-prop.c (ipa_make_edge_direct_to_target): Do not pass frequency
* ipa-utils.c (ipa_merge_profiles): Merge all profiles.
* lto-cgraph.c (lto_output_edge): Do not stream frequency.
(input_node): Do not stream frequency.
(input_edge): Do not stream frequency.
(merge_profile_summaries): Scale only IPA profiles.
* omp-simd-clone.c (simd_clone_adjust): Do not pass frequency.
* predict.c (drop_profile): Do not recompute frequency.
* trans-mem.c (ipa_tm_insert_irr_call): Do not pass frequency.
(ipa_tm_insert_gettmclone_call): Do not pass frequency.
* tree-cfg.c (execute_fixup_cfg): Drop profile to global0 if needed.
* tree-chkp.c (chkp_copy_bounds_for_assign): Do not pass frequency.
* tree-emutls.c (gen_emutls_addr): Do not pass frequency.
* tree-inline.c (copy_bb): Do not scale frequency.
(expand_call_inline): Do not scale frequency.
(tree_function_versioning): Do not scale frequency.
* ubsan.c (ubsan_create_edge): Do not pass frequency.
lto/ChangeLog:
2017-11-10 Jan Hubicka <hubicka@ucw.cz>
* lto-partition.c (lto_balanced_map): Use frequency accessor.
From-SVN: r254636
Diffstat (limited to 'gcc/cgraphclones.c')
-rw-r--r-- | gcc/cgraphclones.c | 72 |
1 files changed, 38 insertions, 34 deletions
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 6513aa7..a575a34 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -87,20 +87,11 @@ along with GCC; see the file COPYING3. If not see cgraph_edge * cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid, profile_count num, profile_count den, - int freq_scale, bool update_original) + bool update_original) { cgraph_edge *new_edge; - profile_count gcov_count - = (num == profile_count::zero () || den > 0) - ? count.apply_scale (num, den) : count; - gcov_type freq; - - /* We do not want to ignore loop nest after frequency drops to 0. */ - if (!freq_scale) - freq_scale = 1; - freq = frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE; - if (freq > CGRAPH_FREQ_MAX) - freq = CGRAPH_FREQ_MAX; + profile_count::adjust_for_ipa_scaling (&num, &den); + profile_count gcov_count = count.apply_scale (num, den); if (indirect_unknown_callee) { @@ -113,19 +104,19 @@ cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid, { cgraph_node *callee = cgraph_node::get (decl); gcc_checking_assert (callee); - new_edge = n->create_edge (callee, call_stmt, gcov_count, freq); + new_edge = n->create_edge (callee, call_stmt, gcov_count); } else { new_edge = n->create_indirect_edge (call_stmt, indirect_info->ecf_flags, - gcov_count, freq, false); + gcov_count, false); *new_edge->indirect_info = *indirect_info; } } else { - new_edge = n->create_edge (callee, call_stmt, gcov_count, freq); + new_edge = n->create_edge (callee, call_stmt, gcov_count); if (indirect_info) { new_edge->indirect_info @@ -142,10 +133,14 @@ cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid, new_edge->call_stmt_cannot_inline_p = call_stmt_cannot_inline_p; new_edge->speculative = speculative; new_edge->in_polymorphic_cdtor = in_polymorphic_cdtor; - if (update_original) - { - count -= new_edge->count; - } + + /* Update IPA profile. Local profiles need no updating in original. */ + if (update_original + && count.ipa () == count && new_edge->count.ipa () == new_edge->count) + count -= new_edge->count; + else if (caller->count.global0 () == caller->count + && !(count == profile_count::zero ())) + count = count.global0 (); symtab->call_edge_duplication_hooks (this, new_edge); return new_edge; } @@ -337,8 +332,7 @@ duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node) new_thunk->clone.args_to_skip = node->clone.args_to_skip; new_thunk->clone.combined_args_to_skip = node->clone.combined_args_to_skip; - cgraph_edge *e = new_thunk->create_edge (node, NULL, new_thunk->count, - CGRAPH_FREQ_BASE); + cgraph_edge *e = new_thunk->create_edge (node, NULL, new_thunk->count); symtab->call_edge_duplication_hooks (thunk->callees, e); symtab->call_cgraph_duplication_hooks (thunk, new_thunk); return new_thunk; @@ -422,7 +416,7 @@ dump_callgraph_transformation (const cgraph_node *original, node is not inlined. */ cgraph_node * -cgraph_node::create_clone (tree new_decl, profile_count prof_count, int freq, +cgraph_node::create_clone (tree new_decl, profile_count prof_count, bool update_original, vec<cgraph_edge *> redirect_callers, bool call_duplication_hook, @@ -432,11 +426,27 @@ cgraph_node::create_clone (tree new_decl, profile_count prof_count, int freq, cgraph_node *new_node = symtab->create_empty (); cgraph_edge *e; unsigned i; + profile_count old_count = count; if (new_inlined_to) dump_callgraph_transformation (this, new_inlined_to, "inlining to"); + if (prof_count == profile_count::zero () + && !(count == profile_count::zero ())) + prof_count = count.global0 (); + new_node->count = prof_count; + + /* Update IPA profile. Local profiles need no updating in original. */ + if (update_original && !(count == profile_count::zero ()) + && count.ipa () == count && prof_count.ipa () == prof_count) + { + if (count.nonzero_p () + && !(count - prof_count).nonzero_p ()) + count = count.global0 (); + else + count -= prof_count; + } new_node->decl = new_decl; new_node->register_symbol (); new_node->origin = origin; @@ -489,12 +499,12 @@ cgraph_node::create_clone (tree new_decl, profile_count prof_count, int freq, new_node->expand_all_artificial_thunks (); for (e = callees;e; e=e->next_callee) - e->clone (new_node, e->call_stmt, e->lto_stmt_uid, new_node->count, count, - freq, update_original); + e->clone (new_node, e->call_stmt, e->lto_stmt_uid, new_node->count, old_count, + update_original); for (e = indirect_calls; e; e = e->next_callee) e->clone (new_node, e->call_stmt, e->lto_stmt_uid, - new_node->count, count, freq, update_original); + new_node->count, old_count, update_original); new_node->clone_references (this); new_node->next_sibling_clone = clones; @@ -503,9 +513,6 @@ cgraph_node::create_clone (tree new_decl, profile_count prof_count, int freq, clones = new_node; new_node->clone_of = this; - if (update_original) - count -= prof_count; - if (call_duplication_hook) symtab->call_cgraph_duplication_hooks (this, new_node); @@ -591,7 +598,7 @@ cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers, SET_DECL_ASSEMBLER_NAME (new_decl, clone_function_name (old_decl, suffix)); SET_DECL_RTL (new_decl, NULL); - new_node = create_clone (new_decl, count, CGRAPH_FREQ_BASE, false, + new_node = create_clone (new_decl, count, false, redirect_callers, false, NULL, args_to_skip, suffix); /* Update the properties. @@ -773,7 +780,6 @@ void cgraph_node::create_edge_including_clones (cgraph_node *callee, gimple *old_stmt, gcall *stmt, profile_count count, - int freq, cgraph_inline_failed_t reason) { cgraph_node *node; @@ -781,7 +787,7 @@ cgraph_node::create_edge_including_clones (cgraph_node *callee, if (!get_edge (stmt)) { - edge = create_edge (callee, stmt, count, freq); + edge = create_edge (callee, stmt, count); edge->inline_failed = reason; } @@ -801,7 +807,7 @@ cgraph_node::create_edge_including_clones (cgraph_node *callee, edge->set_call_stmt (stmt); else if (! node->get_edge (stmt)) { - edge = node->create_edge (callee, stmt, count, freq); + edge = node->create_edge (callee, stmt, count); edge->inline_failed = reason; } @@ -904,14 +910,12 @@ cgraph_node::create_version_clone (tree new_decl, || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index)) e->clone (new_version, e->call_stmt, e->lto_stmt_uid, count, count, - CGRAPH_FREQ_BASE, true); for (e = indirect_calls; e; e=e->next_callee) if (!bbs_to_copy || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index)) e->clone (new_version, e->call_stmt, e->lto_stmt_uid, count, count, - CGRAPH_FREQ_BASE, true); FOR_EACH_VEC_ELT (redirect_callers, i, e) { |