Commit 52261a21 by Jan Hubicka Committed by Jan Hubicka

predict.c (tree_estimate_probability_bb): Add LOCAL_ONLY.

	* predict.c (tree_estimate_probability_bb): Add LOCAL_ONLY.
	(tree_guess_outgoing_edge_probabilities): New.
	* predict.h (tree_guess_outgoing_edge_probabilities): Declare.
	* tree-cfg.c (gimple_find_sub_bbs): Propagate profile.

From-SVN: r248912
parent ce6ec234
2017-06-06 Jan Hubicka <hubicka@ucw.cz> 2017-06-06 Jan Hubicka <hubicka@ucw.cz>
* predict.c (tree_estimate_probability_bb): Add LOCAL_ONLY.
(tree_guess_outgoing_edge_probabilities): New.
* predict.h (tree_guess_outgoing_edge_probabilities): Declare.
* tree-cfg.c (gimple_find_sub_bbs): Propagate profile.
2017-06-06 Jan Hubicka <hubicka@ucw.cz>
* ipa-split.c (split_function): Initialize return bb profile. * ipa-split.c (split_function): Initialize return bb profile.
2017-06-06 Jan Hubicka <hubicka@ucw.cz> 2017-06-06 Jan Hubicka <hubicka@ucw.cz>
......
...@@ -2665,10 +2665,11 @@ assert_is_empty (const_basic_block const &, edge_prediction *const &value, ...@@ -2665,10 +2665,11 @@ assert_is_empty (const_basic_block const &, edge_prediction *const &value,
return false; return false;
} }
/* Predict branch probabilities and estimate profile for basic block BB. */ /* Predict branch probabilities and estimate profile for basic block BB.
When LOCAL_ONLY is set do not use any global properties of CFG. */
static void static void
tree_estimate_probability_bb (basic_block bb) tree_estimate_probability_bb (basic_block bb, bool local_only)
{ {
edge e; edge e;
edge_iterator ei; edge_iterator ei;
...@@ -2742,6 +2743,7 @@ tree_estimate_probability_bb (basic_block bb) ...@@ -2742,6 +2743,7 @@ tree_estimate_probability_bb (basic_block bb)
/* Look for block we are guarding (ie we dominate it, /* Look for block we are guarding (ie we dominate it,
but it doesn't postdominate us). */ but it doesn't postdominate us). */
if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun) && e->dest != bb if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun) && e->dest != bb
&& !local_only
&& dominated_by_p (CDI_DOMINATORS, e->dest, e->src) && dominated_by_p (CDI_DOMINATORS, e->dest, e->src)
&& !dominated_by_p (CDI_POST_DOMINATORS, e->src, e->dest)) && !dominated_by_p (CDI_POST_DOMINATORS, e->src, e->dest))
{ {
...@@ -2800,7 +2802,7 @@ tree_estimate_probability (bool dry_run) ...@@ -2800,7 +2802,7 @@ tree_estimate_probability (bool dry_run)
predict_loops (); predict_loops ();
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
tree_estimate_probability_bb (bb); tree_estimate_probability_bb (bb, false);
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
combine_predictions_for_bb (bb, dry_run); combine_predictions_for_bb (bb, dry_run);
...@@ -2816,6 +2818,19 @@ tree_estimate_probability (bool dry_run) ...@@ -2816,6 +2818,19 @@ tree_estimate_probability (bool dry_run)
free_dominance_info (CDI_POST_DOMINATORS); free_dominance_info (CDI_POST_DOMINATORS);
remove_fake_exit_edges (); remove_fake_exit_edges ();
} }
/* Set edge->probability for each successor edge of BB. */
void
tree_guess_outgoing_edge_probabilities (basic_block bb)
{
bb_predictions = new hash_map<const_basic_block, edge_prediction *>;
tree_estimate_probability_bb (bb, true);
combine_predictions_for_bb (bb, false);
if (flag_checking)
bb_predictions->traverse<void *, assert_is_empty> (NULL);
delete bb_predictions;
bb_predictions = NULL;
}
/* Predict edges to successors of CUR whose sources are not postdominated by /* Predict edges to successors of CUR whose sources are not postdominated by
BB by PRED and recurse to all postdominators. */ BB by PRED and recurse to all postdominators. */
......
...@@ -83,6 +83,7 @@ extern void remove_predictions_associated_with_edge (edge); ...@@ -83,6 +83,7 @@ extern void remove_predictions_associated_with_edge (edge);
extern void predict_edge_def (edge, enum br_predictor, enum prediction); extern void predict_edge_def (edge, enum br_predictor, enum prediction);
extern void invert_br_probabilities (rtx); extern void invert_br_probabilities (rtx);
extern void guess_outgoing_edge_probabilities (basic_block); extern void 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 counts_to_freqs (void);
......
...@@ -1048,10 +1048,27 @@ gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi) ...@@ -1048,10 +1048,27 @@ gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi)
while (bb != afterbb) while (bb != afterbb)
{ {
struct omp_region *cur_region = NULL; struct omp_region *cur_region = NULL;
profile_count cnt = profile_count::zero ();
int freq = 0;
int cur_omp_region_idx = 0; int cur_omp_region_idx = 0;
int mer = make_edges_bb (bb, &cur_region, &cur_omp_region_idx); int mer = make_edges_bb (bb, &cur_region, &cur_omp_region_idx);
gcc_assert (!mer && !cur_region); gcc_assert (!mer && !cur_region);
add_bb_to_loop (bb, afterbb->loop_father); add_bb_to_loop (bb, afterbb->loop_father);
edge e;
edge_iterator ei;
FOR_EACH_EDGE (e, ei, bb->preds)
{
cnt += e->count;
freq += EDGE_FREQUENCY (e);
}
bb->count = cnt;
bb->frequency = freq;
tree_guess_outgoing_edge_probabilities (bb);
FOR_EACH_EDGE (e, ei, bb->succs)
e->count = bb->count.apply_probability (e->probability);
bb = bb->next_bb; bb = bb->next_bb;
} }
return true; return true;
......
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