bb-reorder.c (find_rarely_executed_basic_blocks_and_crossing_edges): Put all BBs reachable only via paths crossing cold region to cold region.
* bb-reorder.c (find_rarely_executed_basic_blocks_and_crossing_edges): Put all BBs reachable only via paths crossing cold region to cold region. * cfgrtl.c (find_bbs_reachable_by_hot_paths): New function. From-SVN: r250417
This commit is contained in:
parent
1dae21ad97
commit
d9af4feaf0
@ -1,3 +1,10 @@
|
||||
2016-07-21 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
* bb-reorder.c (find_rarely_executed_basic_blocks_and_crossing_edges):
|
||||
Put all BBs reachable only via paths crossing cold region to cold
|
||||
region.
|
||||
* cfgrtl.c (find_bbs_reachable_by_hot_paths): New function.
|
||||
|
||||
2016-07-21 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/81303
|
||||
|
@ -1665,6 +1665,12 @@ find_rarely_executed_basic_blocks_and_crossing_edges (void)
|
||||
&bbs_in_hot_partition);
|
||||
if (cold_bb_count)
|
||||
sanitize_hot_paths (false, cold_bb_count, &bbs_in_hot_partition);
|
||||
|
||||
hash_set <basic_block> set;
|
||||
find_bbs_reachable_by_hot_paths (&set);
|
||||
FOR_EACH_BB_FN (bb, cfun)
|
||||
if (!set.contains (bb))
|
||||
BB_SET_PARTITION (bb, BB_COLD_PARTITION);
|
||||
}
|
||||
|
||||
/* The format of .gcc_except_table does not allow landing pads to
|
||||
|
75
gcc/cfgrtl.c
75
gcc/cfgrtl.c
@ -2282,6 +2282,29 @@ get_last_bb_insn (basic_block bb)
|
||||
return end;
|
||||
}
|
||||
|
||||
/* Add all BBs reachable from entry via hot paths into the SET. */
|
||||
|
||||
void
|
||||
find_bbs_reachable_by_hot_paths (hash_set<basic_block> *set)
|
||||
{
|
||||
auto_vec<basic_block, 64> worklist;
|
||||
|
||||
set->add (ENTRY_BLOCK_PTR_FOR_FN (cfun));
|
||||
worklist.safe_push (ENTRY_BLOCK_PTR_FOR_FN (cfun));
|
||||
|
||||
while (worklist.length () > 0)
|
||||
{
|
||||
basic_block bb = worklist.pop ();
|
||||
edge_iterator ei;
|
||||
edge e;
|
||||
|
||||
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||
if (BB_PARTITION (e->dest) != BB_COLD_PARTITION
|
||||
&& !set->add (e->dest))
|
||||
worklist.safe_push (e->dest);
|
||||
}
|
||||
}
|
||||
|
||||
/* Sanity check partition hotness to ensure that basic blocks in
|
||||
the cold partition don't dominate basic blocks in the hot partition.
|
||||
If FLAG_ONLY is true, report violations as errors. Otherwise
|
||||
@ -2295,49 +2318,25 @@ find_partition_fixes (bool flag_only)
|
||||
basic_block bb;
|
||||
vec<basic_block> bbs_in_cold_partition = vNULL;
|
||||
vec<basic_block> bbs_to_fix = vNULL;
|
||||
hash_set<basic_block> set;
|
||||
|
||||
/* Callers check this. */
|
||||
gcc_checking_assert (crtl->has_bb_partition);
|
||||
|
||||
find_bbs_reachable_by_hot_paths (&set);
|
||||
|
||||
FOR_EACH_BB_FN (bb, cfun)
|
||||
if ((BB_PARTITION (bb) == BB_COLD_PARTITION))
|
||||
bbs_in_cold_partition.safe_push (bb);
|
||||
|
||||
if (bbs_in_cold_partition.is_empty ())
|
||||
return vNULL;
|
||||
|
||||
bool dom_calculated_here = !dom_info_available_p (CDI_DOMINATORS);
|
||||
|
||||
if (dom_calculated_here)
|
||||
calculate_dominance_info (CDI_DOMINATORS);
|
||||
|
||||
while (! bbs_in_cold_partition.is_empty ())
|
||||
{
|
||||
bb = bbs_in_cold_partition.pop ();
|
||||
/* Any blocks dominated by a block in the cold section
|
||||
must also be cold. */
|
||||
basic_block son;
|
||||
for (son = first_dom_son (CDI_DOMINATORS, bb);
|
||||
son;
|
||||
son = next_dom_son (CDI_DOMINATORS, son))
|
||||
{
|
||||
/* If son is not yet cold, then mark it cold here and
|
||||
enqueue it for further processing. */
|
||||
if ((BB_PARTITION (son) != BB_COLD_PARTITION))
|
||||
{
|
||||
if (flag_only)
|
||||
error ("non-cold basic block %d dominated "
|
||||
"by a block in the cold partition (%d)", son->index, bb->index);
|
||||
else
|
||||
BB_SET_PARTITION (son, BB_COLD_PARTITION);
|
||||
bbs_to_fix.safe_push (son);
|
||||
bbs_in_cold_partition.safe_push (son);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dom_calculated_here)
|
||||
free_dominance_info (CDI_DOMINATORS);
|
||||
if (!set.contains (bb)
|
||||
&& BB_PARTITION (bb) != BB_COLD_PARTITION)
|
||||
{
|
||||
if (flag_only)
|
||||
error ("non-cold basic block %d reachable only "
|
||||
"by paths crossing the cold partition", bb->index);
|
||||
else
|
||||
BB_SET_PARTITION (bb, BB_COLD_PARTITION);
|
||||
bbs_to_fix.safe_push (bb);
|
||||
bbs_in_cold_partition.safe_push (bb);
|
||||
}
|
||||
|
||||
return bbs_to_fix;
|
||||
}
|
||||
|
@ -54,5 +54,6 @@ extern void cfg_layout_initialize (int);
|
||||
extern void cfg_layout_finalize (void);
|
||||
extern void break_superblocks (void);
|
||||
extern void init_rtl_bb_info (basic_block);
|
||||
extern void find_bbs_reachable_by_hot_paths (hash_set <basic_block> *);
|
||||
|
||||
#endif /* GCC_CFGRTL_H */
|
||||
|
Loading…
Reference in New Issue
Block a user