Commit 6fcdf714 by Jan Hubicka Committed by Jan Hubicka

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
parent 96feaf79
2017-06-06 Jan Hubicka <hubicka@ucw.cz>
* 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 <jim.wilson@linaro.org> 2017-06-06 Jim Wilson <jim.wilson@linaro.org>
* config/aarch64/aarch64-cost-tables.h (qdf24xx_extra_costs): Move to * config/aarch64/aarch64-cost-tables.h (qdf24xx_extra_costs): Move to
......
...@@ -475,6 +475,10 @@ find_bb_boundaries (basic_block bb) ...@@ -475,6 +475,10 @@ find_bb_boundaries (basic_block bb)
bb = fallthru->dest; bb = fallthru->dest;
remove_edge (fallthru); 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; flow_transfer_insn = NULL;
if (code == CODE_LABEL && LABEL_ALT_ENTRY_P (insn)) if (code == CODE_LABEL && LABEL_ALT_ENTRY_P (insn))
make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), bb, 0); make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), bb, 0);
...@@ -577,7 +581,7 @@ compute_outgoing_frequencies (basic_block b) ...@@ -577,7 +581,7 @@ compute_outgoing_frequencies (basic_block b)
guess_outgoing_edge_probabilities (b); guess_outgoing_edge_probabilities (b);
} }
if (b->count > profile_count::zero ()) if (b->count.initialized_p ())
FOR_EACH_EDGE (e, ei, b->succs) FOR_EACH_EDGE (e, ei, b->succs)
e->count = b->count.apply_probability (e->probability); e->count = b->count.apply_probability (e->probability);
} }
...@@ -590,6 +594,9 @@ void ...@@ -590,6 +594,9 @@ void
find_many_sub_basic_blocks (sbitmap blocks) find_many_sub_basic_blocks (sbitmap blocks)
{ {
basic_block bb, min, max; basic_block bb, min, max;
bool found = false;
auto_vec<unsigned int> n_succs;
n_succs.safe_grow_cleared (last_basic_block_for_fn (cfun));
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
SET_STATE (bb, SET_STATE (bb,
...@@ -597,11 +604,24 @@ find_many_sub_basic_blocks (sbitmap blocks) ...@@ -597,11 +604,24 @@ find_many_sub_basic_blocks (sbitmap blocks)
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
if (STATE (bb) == BLOCK_TO_SPLIT) 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) FOR_EACH_BB_FN (bb, cfun)
if (STATE (bb) != BLOCK_ORIGINAL) if (STATE (bb) != BLOCK_ORIGINAL)
break; {
found = true;
break;
}
if (!found)
return;
min = max = bb; min = max = bb;
for (; bb != EXIT_BLOCK_PTR_FOR_FN (cfun); bb = bb->next_bb) for (; bb != EXIT_BLOCK_PTR_FOR_FN (cfun); bb = bb->next_bb)
...@@ -624,14 +644,37 @@ find_many_sub_basic_blocks (sbitmap blocks) ...@@ -624,14 +644,37 @@ find_many_sub_basic_blocks (sbitmap blocks)
continue; continue;
if (STATE (bb) == BLOCK_NEW) if (STATE (bb) == BLOCK_NEW)
{ {
bool initialized_src = false, uninitialized_src = false;
bb->count = profile_count::zero (); bb->count = profile_count::zero ();
bb->frequency = 0; bb->frequency = 0;
FOR_EACH_EDGE (e, ei, bb->preds) 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); 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); compute_outgoing_frequencies (bb);
} }
......
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