diff options
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 81 |
1 files changed, 21 insertions, 60 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index fc5d2c7..5c49214 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2001,23 +2001,16 @@ copy_bb (copy_body_data *id, basic_block bb, edge = id->src_node->get_edge (orig_stmt); if (edge) { - int edge_freq = edge->frequency; - int new_freq; struct cgraph_edge *old_edge = edge; + profile_count old_cnt = edge->count; edge = edge->clone (id->dst_node, call_stmt, gimple_uid (stmt), - profile_count::one (), - profile_count::one (), - CGRAPH_FREQ_BASE, + num, den, true); - /* We could also just rescale the frequency, but - doing so would introduce roundoff errors and make - verifier unhappy. */ - new_freq = compute_call_stmt_bb_frequency (id->dst_node->decl, - copy_basic_block); - - /* Speculative calls consist of two edges - direct and indirect. - Duplicate the whole thing and distribute frequencies accordingly. */ + + /* Speculative calls consist of two edges - direct and + indirect. Duplicate the whole thing and distribute + frequencies accordingly. */ if (edge->speculative) { struct cgraph_edge *direct, *indirect; @@ -2025,42 +2018,22 @@ copy_bb (copy_body_data *id, basic_block bb, gcc_assert (!edge->indirect_unknown_callee); old_edge->speculative_call_info (direct, indirect, ref); + + profile_count indir_cnt = indirect->count; indirect = indirect->clone (id->dst_node, call_stmt, gimple_uid (stmt), - profile_count::one (), - profile_count::one (), - CGRAPH_FREQ_BASE, + num, den, true); - if (old_edge->frequency + indirect->frequency) - { - edge->frequency = MIN (RDIV ((gcov_type)new_freq * old_edge->frequency, - (old_edge->frequency + indirect->frequency)), - CGRAPH_FREQ_MAX); - indirect->frequency = MIN (RDIV ((gcov_type)new_freq * indirect->frequency, - (old_edge->frequency + indirect->frequency)), - CGRAPH_FREQ_MAX); - } + + profile_probability prob + = indir_cnt.probability_in (old_cnt + indir_cnt); + indirect->count + = copy_basic_block->count.apply_probability (prob); + edge->count = copy_basic_block->count - indirect->count; id->dst_node->clone_reference (ref, stmt); } else - { - edge->frequency = new_freq; - if (dump_file - && profile_status_for_fn (cfun) != PROFILE_ABSENT - && (edge_freq > edge->frequency + 10 - || edge_freq < edge->frequency - 10)) - { - fprintf (dump_file, "Edge frequency estimated by " - "cgraph %i diverge from inliner's estimate %i\n", - edge_freq, - edge->frequency); - fprintf (dump_file, - "Orig bb: %i, orig bb freq %i, new bb freq %i\n", - bb->index, - bb->count.to_frequency (cfun), - copy_basic_block->count.to_frequency (cfun)); - } - } + edge->count = copy_basic_block->count; } break; @@ -2103,15 +2076,10 @@ copy_bb (copy_body_data *id, basic_block bb, if (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES) id->dst_node->create_edge_including_clones (dest, orig_stmt, call_stmt, bb->count, - compute_call_stmt_bb_frequency (id->dst_node->decl, - copy_basic_block), CIF_ORIGINALLY_INDIRECT_CALL); else id->dst_node->create_edge (dest, call_stmt, - bb->count, - compute_call_stmt_bb_frequency - (id->dst_node->decl, - copy_basic_block))->inline_failed + bb->count)->inline_failed = CIF_ORIGINALLY_INDIRECT_CALL; if (dump_file) { @@ -4475,7 +4443,6 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) { cgraph_edge *edge; tree virtual_offset = NULL; - int freq = cg_edge->frequency; profile_count count = cg_edge->count; tree op; gimple_stmt_iterator iter = gsi_for_stmt (stmt); @@ -4485,9 +4452,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) gimple_uid (stmt), profile_count::one (), profile_count::one (), - CGRAPH_FREQ_BASE, true); - edge->frequency = freq; edge->count = count; if (id->src_node->thunk.virtual_offset_p) virtual_offset = size_int (id->src_node->thunk.virtual_value); @@ -4709,7 +4674,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) print_generic_expr (dump_file, id->src_fn); fprintf (dump_file, " to "); print_generic_expr (dump_file, id->dst_fn); - fprintf (dump_file, " with frequency %i\n", cg_edge->frequency); + fprintf (dump_file, " with frequency %i\n", cg_edge->frequency ()); } /* This is it. Duplicate the callee body. Assume callee is @@ -6089,20 +6054,16 @@ tree_function_versioning (tree old_decl, tree new_decl, struct cgraph_edge *e; rebuild_frequencies (); - new_version_node->count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa (); + new_version_node->count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count; for (e = new_version_node->callees; e; e = e->next_callee) { basic_block bb = gimple_bb (e->call_stmt); - e->frequency = compute_call_stmt_bb_frequency (current_function_decl, - bb); - e->count = bb->count.ipa (); + e->count = bb->count; } for (e = new_version_node->indirect_calls; e; e = e->next_callee) { basic_block bb = gimple_bb (e->call_stmt); - e->frequency = compute_call_stmt_bb_frequency (current_function_decl, - bb); - e->count = bb->count.ipa (); + e->count = bb->count; } } |