From 6fcdf714130596ac05167398c56897d72ab3e759 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 7 Jun 2017 08:42:43 +0200 Subject: [PATCH] cfgbuild.c (find_bb_boundaries): Initialize profile of split blocks. * cfgbuild.c (find_bb_boundaries): Initialize profile of split blocks. (compute_outgoing_frequencies): Also initialize zero counts. (find_many_sub_basic_blocks): Do not produce uninitialized profile around loops; preserve more of profile when nothing changes. From-SVN: r248945 --- gcc/ChangeLog | 7 +++++++ gcc/cfgbuild.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 519fd625851..3b2c8b9d6aa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-06-06 Jan Hubicka + + * cfgbuild.c (find_bb_boundaries): Initialize profile of split blocks. + (compute_outgoing_frequencies): Also initialize zero counts. + (find_many_sub_basic_blocks): Do not produce uninitialized profile + around loops; preserve more of profile when nothing changes. + 2017-06-06 Jim Wilson * config/aarch64/aarch64-cost-tables.h (qdf24xx_extra_costs): Move to diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c index a4004f87e93..f4a4d088251 100644 --- a/gcc/cfgbuild.c +++ b/gcc/cfgbuild.c @@ -475,6 +475,10 @@ find_bb_boundaries (basic_block bb) bb = fallthru->dest; remove_edge (fallthru); + /* BB is unreachable at this point - we need to determine its profile + once edges are built. */ + bb->frequency = 0; + bb->count = profile_count::uninitialized (); flow_transfer_insn = NULL; if (code == CODE_LABEL && LABEL_ALT_ENTRY_P (insn)) make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), bb, 0); @@ -577,7 +581,7 @@ compute_outgoing_frequencies (basic_block b) guess_outgoing_edge_probabilities (b); } - if (b->count > profile_count::zero ()) + if (b->count.initialized_p ()) FOR_EACH_EDGE (e, ei, b->succs) e->count = b->count.apply_probability (e->probability); } @@ -590,6 +594,9 @@ void find_many_sub_basic_blocks (sbitmap blocks) { basic_block bb, min, max; + bool found = false; + auto_vec n_succs; + n_succs.safe_grow_cleared (last_basic_block_for_fn (cfun)); FOR_EACH_BB_FN (bb, cfun) SET_STATE (bb, @@ -597,11 +604,24 @@ find_many_sub_basic_blocks (sbitmap blocks) FOR_EACH_BB_FN (bb, cfun) if (STATE (bb) == BLOCK_TO_SPLIT) - find_bb_boundaries (bb); + { + int n = last_basic_block_for_fn (cfun); + unsigned int ns = EDGE_COUNT (bb->succs); + + find_bb_boundaries (bb); + if (n == last_basic_block_for_fn (cfun) && ns == EDGE_COUNT (bb->succs)) + n_succs[bb->index] = EDGE_COUNT (bb->succs); + } FOR_EACH_BB_FN (bb, cfun) if (STATE (bb) != BLOCK_ORIGINAL) - break; + { + found = true; + break; + } + + if (!found) + return; min = max = bb; for (; bb != EXIT_BLOCK_PTR_FOR_FN (cfun); bb = bb->next_bb) @@ -624,14 +644,37 @@ find_many_sub_basic_blocks (sbitmap blocks) continue; if (STATE (bb) == BLOCK_NEW) { + bool initialized_src = false, uninitialized_src = false; bb->count = profile_count::zero (); bb->frequency = 0; FOR_EACH_EDGE (e, ei, bb->preds) { - bb->count += e->count; + if (e->count.initialized_p ()) + { + bb->count += e->count; + initialized_src = true; + } + else + uninitialized_src = false; bb->frequency += EDGE_FREQUENCY (e); } + /* When some edges are missing with read profile, this is + most likely because RTL expansion introduced loop. + When profile is guessed we may have BB that is reachable + from unlikely path as well as from normal path. + + TODO: We should handle loops created during BB expansion + correctly here. For now we assume all those loop to cycle + precisely once. */ + if (!initialized_src + || (uninitialized_src + && profile_status_for_fn (cfun) != PROFILE_READ)) + bb->count = profile_count::uninitialized (); } + else + /* If nothing changed, there is no need to create new BBs. */ + if (EDGE_COUNT (bb->succs) == n_succs[bb->index]) + continue; compute_outgoing_frequencies (bb); } -- 2.30.2