This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Update profile in gimple_find_sub_bbs
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 6 Jun 2017 10:13:34 +0200
- Subject: Update profile in gimple_find_sub_bbs
- Authentication-results: sourceware.org; auth=none
Hi,
gimple_find_sub_bbs misses any profile updating code. While this is legacy
function it seems it is in tree for quite a while. This patch adds similar
logic to RTL's variant.
Profiledbootstraped/regtested x86_64-linux, comitted.
Honza
* 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.
Index: predict.c
===================================================================
--- predict.c (revision 248909)
+++ predict.c (working copy)
@@ -2665,10 +2665,11 @@ assert_is_empty (const_basic_block const
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_bloc
/* 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<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
BB by PRED and recurse to all postdominators. */
Index: predict.h
===================================================================
--- predict.h (revision 248909)
+++ predict.h (working copy)
@@ -83,6 +83,7 @@ extern void remove_predictions_associate
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);
Index: tree-cfg.c
===================================================================
--- tree-cfg.c (revision 248909)
+++ tree-cfg.c (working copy)
@@ -1048,10 +1048,27 @@ gimple_find_sub_bbs (gimple_seq seq, gim
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;