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
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);
- 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);
- }
- }
- }
+ find_bbs_reachable_by_hot_paths (&set);
- if (dom_calculated_here)
- free_dominance_info (CDI_DOMINATORS);
+ FOR_EACH_BB_FN (bb, cfun)
+ 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;
}