Commit fc06ae0d by Jan Hubicka Committed by Jan Hubicka

auto-profile.c (afdo_annotate_cfg): Use update_max_bb_count.


	* auto-profile.c (afdo_annotate_cfg): Use update_max_bb_count.
	* cgraphunit.c (cgraph_node::expand_thunk): Use update_max_bb_count.
	* ipa-utils.c (ipa_merge_profiles): Use update_max_bb_count.
	* lto-streamer-in.c (input_function): Use update_max_bb_count.
	* omp-expand.c (expand_omp_taskreg): Use update_max_bb_count.
	* predict.c (maybe_hot_frequency_p): Inline to ...
	(maybe_hot_count_p): ... here; rewrite to counts.
	(counts_to_freqs): Rename to ...
	(update_max_bb_count): ... this one.
	(expensive_function_p): Use counts.
	(estimate_bb_frequencies): Update.
	(rebuild_frequencies): Update.
	* predict.h (counts_to_freqs): Rename to ...
	(update_max_bb_count): ... this one.
	* profile.c (compute_branch_probabilities): Add debug info
	* tree-inline.c (expand_call_inline): Update debug info.
	(optimize_inline_calls): Use update_max_bb_count..
	(tree_function_versioning): Use update_max_bb_count..
	* value-prof.c (gimple_value_profile_transformations):
	Do not use update_max_bb_count.

From-SVN: r254725
parent 0cea1d34
2017-11-13 Jan Hubicka <hubicka@ucw.cz> 2017-11-13 Jan Hubicka <hubicka@ucw.cz>
* auto-profile.c (afdo_annotate_cfg): Use update_max_bb_count.
* cgraphunit.c (cgraph_node::expand_thunk): Use update_max_bb_count.
* ipa-utils.c (ipa_merge_profiles): Use update_max_bb_count.
* lto-streamer-in.c (input_function): Use update_max_bb_count.
* omp-expand.c (expand_omp_taskreg): Use update_max_bb_count.
* predict.c (maybe_hot_frequency_p): Inline to ...
(maybe_hot_count_p): ... here; rewrite to counts.
(counts_to_freqs): Rename to ...
(update_max_bb_count): ... this one.
(expensive_function_p): Use counts.
(estimate_bb_frequencies): Update.
(rebuild_frequencies): Update.
* predict.h (counts_to_freqs): Rename to ...
(update_max_bb_count): ... this one.
* profile.c (compute_branch_probabilities): Add debug info
* tree-inline.c (expand_call_inline): Update debug info.
(optimize_inline_calls): Use update_max_bb_count..
(tree_function_versioning): Use update_max_bb_count..
* value-prof.c (gimple_value_profile_transformations):
Do not use update_max_bb_count.
2017-11-13 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline.c (compute_uninlined_call_time, compute_inlined_call_time): * ipa-inline.c (compute_uninlined_call_time, compute_inlined_call_time):
always use frequencies. always use frequencies.
...@@ -1571,7 +1571,7 @@ afdo_annotate_cfg (const stmt_set &promoted_stmts) ...@@ -1571,7 +1571,7 @@ afdo_annotate_cfg (const stmt_set &promoted_stmts)
if (max_count > profile_count::zero ()) if (max_count > profile_count::zero ())
{ {
afdo_calculate_branch_prob (&annotated_bb, &annotated_edge); afdo_calculate_branch_prob (&annotated_bb, &annotated_edge);
counts_to_freqs (); update_max_bb_count ();
profile_status_for_fn (cfun) = PROFILE_READ; profile_status_for_fn (cfun) = PROFILE_READ;
} }
if (flag_value_profile_transformations) if (flag_value_profile_transformations)
......
...@@ -2026,7 +2026,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk) ...@@ -2026,7 +2026,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
} }
cfun->gimple_df->in_ssa_p = true; cfun->gimple_df->in_ssa_p = true;
counts_to_freqs (); update_max_bb_count ();
profile_status_for_fn (cfun) profile_status_for_fn (cfun)
= cfg_count.initialized_p () && cfg_count.ipa_p () = cfg_count.initialized_p () && cfg_count.ipa_p ()
? PROFILE_READ : PROFILE_GUESSED; ? PROFILE_READ : PROFILE_GUESSED;
......
...@@ -558,7 +558,7 @@ ipa_merge_profiles (struct cgraph_node *dst, ...@@ -558,7 +558,7 @@ ipa_merge_profiles (struct cgraph_node *dst,
} }
} }
push_cfun (dstcfun); push_cfun (dstcfun);
counts_to_freqs (); update_max_bb_count ();
compute_function_frequency (); compute_function_frequency ();
pop_cfun (); pop_cfun ();
for (e = dst->callees; e; e = e->next_callee) for (e = dst->callees; e; e = e->next_callee)
......
...@@ -1192,7 +1192,7 @@ input_function (tree fn_decl, struct data_in *data_in, ...@@ -1192,7 +1192,7 @@ input_function (tree fn_decl, struct data_in *data_in,
gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest)); gimple_set_body (fn_decl, bb_seq (ei_edge (ei)->dest));
} }
counts_to_freqs (); update_max_bb_count ();
fixup_call_stmt_edges (node, stmts); fixup_call_stmt_edges (node, stmts);
execute_all_ipa_stmt_fixups (node, stmts); execute_all_ipa_stmt_fixups (node, stmts);
......
...@@ -1399,7 +1399,7 @@ expand_omp_taskreg (struct omp_region *region) ...@@ -1399,7 +1399,7 @@ expand_omp_taskreg (struct omp_region *region)
if (optimize) if (optimize)
optimize_omp_library_calls (entry_stmt); optimize_omp_library_calls (entry_stmt);
counts_to_freqs (); update_max_bb_count ();
cgraph_edge::rebuild_edges (); cgraph_edge::rebuild_edges ();
/* Some EH regions might become dead, see PR34608. If /* Some EH regions might become dead, see PR34608. If
......
...@@ -121,32 +121,6 @@ static const struct predictor_info predictor_info[]= { ...@@ -121,32 +121,6 @@ static const struct predictor_info predictor_info[]= {
}; };
#undef DEF_PREDICTOR #undef DEF_PREDICTOR
/* Return TRUE if frequency FREQ is considered to be hot. */
static inline bool
maybe_hot_frequency_p (struct function *fun, int freq)
{
struct cgraph_node *node = cgraph_node::get (fun->decl);
if (!profile_info || profile_status_for_fn (fun) != PROFILE_READ)
{
if (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
return false;
if (node->frequency == NODE_FREQUENCY_HOT)
return true;
}
if (profile_status_for_fn (fun) == PROFILE_ABSENT)
return true;
if (node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
&& freq < (ENTRY_BLOCK_PTR_FOR_FN (fun)->count.to_frequency (fun) * 2 / 3))
return false;
if (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION) == 0)
return false;
if (freq * PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)
< ENTRY_BLOCK_PTR_FOR_FN (fun)->count.to_frequency (fun))
return false;
return true;
}
static gcov_type min_count = -1; static gcov_type min_count = -1;
/* Determine the threshold for hot BB counts. */ /* Determine the threshold for hot BB counts. */
...@@ -179,10 +153,30 @@ maybe_hot_count_p (struct function *fun, profile_count count) ...@@ -179,10 +153,30 @@ maybe_hot_count_p (struct function *fun, profile_count count)
{ {
if (!count.initialized_p ()) if (!count.initialized_p ())
return true; return true;
if (!count.ipa_p ())
return maybe_hot_frequency_p (fun, count.to_frequency (fun));
if (count.ipa () == profile_count::zero ()) if (count.ipa () == profile_count::zero ())
return false; return false;
if (!count.ipa_p ())
{
struct cgraph_node *node = cgraph_node::get (fun->decl);
if (!profile_info || profile_status_for_fn (fun) != PROFILE_READ)
{
if (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
return false;
if (node->frequency == NODE_FREQUENCY_HOT)
return true;
}
if (profile_status_for_fn (fun) == PROFILE_ABSENT)
return true;
if (node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
&& count < (ENTRY_BLOCK_PTR_FOR_FN (fun)->count.apply_scale (2, 3)))
return false;
if (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION) == 0)
return false;
if (count.apply_scale (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION), 1)
< ENTRY_BLOCK_PTR_FOR_FN (fun)->count)
return false;
return true;
}
/* Code executed at most once is not hot. */ /* Code executed at most once is not hot. */
if (count <= MAX (profile_info ? profile_info->runs : 1, 1)) if (count <= MAX (profile_info ? profile_info->runs : 1, 1))
return false; return false;
...@@ -3317,7 +3311,7 @@ handle_missing_profiles (void) ...@@ -3317,7 +3311,7 @@ handle_missing_profiles (void)
Return nonzero iff there was any nonzero execution count. */ Return nonzero iff there was any nonzero execution count. */
bool bool
counts_to_freqs (void) update_max_bb_count (void)
{ {
profile_count true_count_max = profile_count::uninitialized (); profile_count true_count_max = profile_count::uninitialized ();
basic_block bb; basic_block bb;
...@@ -3327,7 +3321,7 @@ counts_to_freqs (void) ...@@ -3327,7 +3321,7 @@ counts_to_freqs (void)
cfun->cfg->count_max = true_count_max; cfun->cfg->count_max = true_count_max;
return true_count_max.nonzero_p (); return true_count_max.ipa ().nonzero_p ();
} }
/* Return true if function is likely to be expensive, so there is no point to /* Return true if function is likely to be expensive, so there is no point to
...@@ -3338,30 +3332,37 @@ counts_to_freqs (void) ...@@ -3338,30 +3332,37 @@ counts_to_freqs (void)
bool bool
expensive_function_p (int threshold) expensive_function_p (int threshold)
{ {
unsigned int sum = 0;
basic_block bb; basic_block bb;
unsigned int limit;
/* We can not compute accurately for large thresholds due to scaled /* We can not compute accurately for large thresholds due to scaled
frequencies. */ frequencies. */
gcc_assert (threshold <= BB_FREQ_MAX); gcc_assert (threshold <= BB_FREQ_MAX);
/* Frequencies are out of range. This either means that function contains /* If profile was scaled in a way entry block has count 0, then the function
internal loop executing more than BB_FREQ_MAX times or profile feedback is deifnitly taking a lot of time. */
is available and function has not been executed at all. */ if (!ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.nonzero_p ())
if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.to_frequency (cfun) == 0)
return true; return true;
/* Maximally BB_FREQ_MAX^2 so overflow won't happen. */ /* Maximally BB_FREQ_MAX^2 so overflow won't happen. */
limit = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.to_frequency (cfun) * threshold; profile_count limit = ENTRY_BLOCK_PTR_FOR_FN
(cfun)->count.apply_scale (threshold, 1);
profile_count sum = profile_count::zero ();
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
{ {
rtx_insn *insn; rtx_insn *insn;
if (!bb->count.initialized_p ())
{
if (dump_file)
fprintf (dump_file, "Function is considered expensive because"
" count of bb %i is not initialized\n", bb->index);
return true;
}
FOR_BB_INSNS (bb, insn) FOR_BB_INSNS (bb, insn)
if (active_insn_p (insn)) if (active_insn_p (insn))
{ {
sum += bb->count.to_frequency (cfun); sum += bb->count;
if (sum > limit) if (sum > limit)
return true; return true;
} }
...@@ -3521,7 +3522,7 @@ estimate_bb_frequencies (bool force) ...@@ -3521,7 +3522,7 @@ estimate_bb_frequencies (bool force)
determine_unlikely_bbs (); determine_unlikely_bbs ();
if (force || profile_status_for_fn (cfun) != PROFILE_READ if (force || profile_status_for_fn (cfun) != PROFILE_READ
|| !counts_to_freqs ()) || !update_max_bb_count ())
{ {
static int real_values_initialized = 0; static int real_values_initialized = 0;
...@@ -3873,7 +3874,7 @@ rebuild_frequencies (void) ...@@ -3873,7 +3874,7 @@ rebuild_frequencies (void)
loop_optimizer_finalize (); loop_optimizer_finalize ();
} }
else if (profile_status_for_fn (cfun) == PROFILE_READ) else if (profile_status_for_fn (cfun) == PROFILE_READ)
counts_to_freqs (); update_max_bb_count ();
else else
gcc_unreachable (); gcc_unreachable ();
timevar_pop (TV_REBUILD_FREQUENCIES); timevar_pop (TV_REBUILD_FREQUENCIES);
......
...@@ -89,7 +89,7 @@ extern void guess_outgoing_edge_probabilities (basic_block); ...@@ -89,7 +89,7 @@ extern void guess_outgoing_edge_probabilities (basic_block);
extern void tree_guess_outgoing_edge_probabilities (basic_block); extern void tree_guess_outgoing_edge_probabilities (basic_block);
extern void tree_estimate_probability (bool); extern void tree_estimate_probability (bool);
extern void handle_missing_profiles (void); extern void handle_missing_profiles (void);
extern bool counts_to_freqs (void); extern bool update_max_bb_count (void);
extern bool expensive_function_p (int); extern bool expensive_function_p (int);
extern void estimate_bb_frequencies (bool); extern void estimate_bb_frequencies (bool);
extern void compute_function_frequency (void); extern void compute_function_frequency (void);
......
...@@ -497,7 +497,11 @@ compute_branch_probabilities (unsigned cfg_checksum, unsigned lineno_checksum) ...@@ -497,7 +497,11 @@ compute_branch_probabilities (unsigned cfg_checksum, unsigned lineno_checksum)
/* Very simple sanity checks so we catch bugs in our profiling code. */ /* Very simple sanity checks so we catch bugs in our profiling code. */
if (!profile_info) if (!profile_info)
return; {
if (dump_file)
fprintf (dump_file, "Profile info is missing; giving up\n");
return;
}
bb_gcov_counts.safe_grow_cleared (last_basic_block_for_fn (cfun)); bb_gcov_counts.safe_grow_cleared (last_basic_block_for_fn (cfun));
edge_gcov_counts = new hash_map<edge,gcov_type>; edge_gcov_counts = new hash_map<edge,gcov_type>;
...@@ -805,7 +809,7 @@ compute_branch_probabilities (unsigned cfg_checksum, unsigned lineno_checksum) ...@@ -805,7 +809,7 @@ compute_branch_probabilities (unsigned cfg_checksum, unsigned lineno_checksum)
delete edge_gcov_counts; delete edge_gcov_counts;
edge_gcov_counts = NULL; edge_gcov_counts = NULL;
counts_to_freqs (); update_max_bb_count ();
if (dump_file) if (dump_file)
{ {
......
...@@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-chkp.h" #include "tree-chkp.h"
#include "stringpool.h" #include "stringpool.h"
#include "attribs.h" #include "attribs.h"
#include "sreal.h"
/* I'm not real happy about this, but we need to handle gimple and /* I'm not real happy about this, but we need to handle gimple and
non-gimple trees. */ non-gimple trees. */
...@@ -4670,11 +4671,12 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) ...@@ -4670,11 +4671,12 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
fprintf (dump_file, "Inlining "); fprintf (dump_file, "Inlining %s to %s with frequency %4.2f\n",
print_generic_expr (dump_file, id->src_fn); xstrdup_for_dump (id->src_node->dump_name ()),
fprintf (dump_file, " to "); xstrdup_for_dump (id->dst_node->dump_name ()),
print_generic_expr (dump_file, id->dst_fn); cg_edge->sreal_frequency ().to_double ());
fprintf (dump_file, " with frequency %i\n", cg_edge->frequency ()); id->src_node->dump (dump_file);
id->dst_node->dump (dump_file);
} }
/* This is it. Duplicate the callee body. Assume callee is /* This is it. Duplicate the callee body. Assume callee is
...@@ -5057,7 +5059,7 @@ optimize_inline_calls (tree fn) ...@@ -5057,7 +5059,7 @@ optimize_inline_calls (tree fn)
} }
/* Fold queued statements. */ /* Fold queued statements. */
counts_to_freqs (); update_max_bb_count ();
fold_marked_statements (last, id.statements_to_fold); fold_marked_statements (last, id.statements_to_fold);
delete id.statements_to_fold; delete id.statements_to_fold;
...@@ -6034,7 +6036,7 @@ tree_function_versioning (tree old_decl, tree new_decl, ...@@ -6034,7 +6036,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
free_dominance_info (CDI_DOMINATORS); free_dominance_info (CDI_DOMINATORS);
free_dominance_info (CDI_POST_DOMINATORS); free_dominance_info (CDI_POST_DOMINATORS);
counts_to_freqs (); update_max_bb_count ();
fold_marked_statements (0, id.statements_to_fold); fold_marked_statements (0, id.statements_to_fold);
delete id.statements_to_fold; delete id.statements_to_fold;
delete_unreachable_blocks_update_callgraph (&id); delete_unreachable_blocks_update_callgraph (&id);
......
...@@ -673,11 +673,6 @@ gimple_value_profile_transformations (void) ...@@ -673,11 +673,6 @@ gimple_value_profile_transformations (void)
} }
} }
if (changed)
{
counts_to_freqs ();
}
return changed; return changed;
} }
......
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