From: Jan Hubicka Date: Tue, 6 Jun 2017 08:07:31 +0000 (+0200) Subject: predict.c (tree_estimate_probability_bb): Add LOCAL_ONLY. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=52261a21e8e74b98a943b2e9de1b9bef659bb28f;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8a5960f7efb..7d6eb885a67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-06-06 Jan Hubicka + + * 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 * ipa-split.c (split_function): Initialize return bb profile. diff --git a/gcc/predict.c b/gcc/predict.c index 8eb28634b2f..2dbe3afa48b 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2665,10 +2665,11 @@ assert_is_empty (const_basic_block const &, edge_prediction *const &value, 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 -tree_estimate_probability_bb (basic_block bb) +tree_estimate_probability_bb (basic_block bb, bool local_only) { edge e; edge_iterator ei; @@ -2742,6 +2743,7 @@ tree_estimate_probability_bb (basic_block bb) /* Look for block we are guarding (ie we dominate it, but it doesn't postdominate us). */ 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_POST_DOMINATORS, e->src, e->dest)) { @@ -2800,7 +2802,7 @@ tree_estimate_probability (bool dry_run) predict_loops (); FOR_EACH_BB_FN (bb, cfun) - tree_estimate_probability_bb (bb); + tree_estimate_probability_bb (bb, false); FOR_EACH_BB_FN (bb, cfun) combine_predictions_for_bb (bb, dry_run); @@ -2816,6 +2818,19 @@ tree_estimate_probability (bool dry_run) free_dominance_info (CDI_POST_DOMINATORS); 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; + tree_estimate_probability_bb (bb, true); + combine_predictions_for_bb (bb, false); + if (flag_checking) + bb_predictions->traverse (NULL); + delete bb_predictions; + bb_predictions = NULL; +} /* Predict edges to successors of CUR whose sources are not postdominated by BB by PRED and recurse to all postdominators. */ diff --git a/gcc/predict.h b/gcc/predict.h index d8ef0ab6c42..1441fa4d8eb 100644 --- a/gcc/predict.h +++ b/gcc/predict.h @@ -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 invert_br_probabilities (rtx); 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 handle_missing_profiles (void); extern bool counts_to_freqs (void); diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 286cc79647a..1d5271a085c 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1048,10 +1048,27 @@ gimple_find_sub_bbs (gimple_seq seq, gimple_stmt_iterator *gsi) while (bb != afterbb) { struct omp_region *cur_region = NULL; + profile_count cnt = profile_count::zero (); + int freq = 0; + int cur_omp_region_idx = 0; int mer = make_edges_bb (bb, &cur_region, &cur_omp_region_idx); gcc_assert (!mer && !cur_region); 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; } return true;