aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2017-07-19 20:08:53 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2017-07-19 18:08:53 +0000
commit95a60a5c8c5620da65d588b6b8c71f8145a31993 (patch)
treea76ab832acdfe295d71d6ba8b0f011425fb99cb6 /gcc
parent3fa410c0827461ed141fcfcd93e019e0bba8ddc1 (diff)
downloadgcc-95a60a5c8c5620da65d588b6b8c71f8145a31993.zip
gcc-95a60a5c8c5620da65d588b6b8c71f8145a31993.tar.gz
gcc-95a60a5c8c5620da65d588b6b8c71f8145a31993.tar.bz2
predict.c (propagate_unlikely_bbs_forward): Break out from ...
* predict.c (propagate_unlikely_bbs_forward): Break out from ... (determine_unlikely_bbs): ... here. * predict.h (propagate_unlikely_bbs_forward): Declare. * cfgexpand.c (pass_expand::execute): Use it. * bb-reorder.c (sanitize_hot_paths): Do not consider known to be unlikely edges. (find_rarely_executed_basic_blocks_and_crossing_edges): Use propagate_unlikely_bbs_forward. From-SVN: r250359
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/predict.c86
2 files changed, 60 insertions, 37 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 44b3ba9..746b08e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
2017-07-19 Jan Hubicka <hubicka@ucw.cz>
+ * predict.c (propagate_unlikely_bbs_forward): Break out from ...
+ (determine_unlikely_bbs): ... here.
+ * predict.h (propagate_unlikely_bbs_forward): Declare.
+ * cfgexpand.c (pass_expand::execute): Use it.
+ * bb-reorder.c (sanitize_hot_paths): Do not consider known to be
+ unlikely edges.
+ (find_rarely_executed_basic_blocks_and_crossing_edges): Use
+ propagate_unlikely_bbs_forward.
+
+2017-07-19 Jan Hubicka <hubicka@ucw.cz>
+
PR middle-end/81331
* except.c (maybe_add_nop_after_section_switch): New function.
(execute): Use it.
diff --git a/gcc/predict.c b/gcc/predict.c
index 1e2e11d..609c099 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -3374,6 +3374,55 @@ expensive_function_p (int threshold)
return false;
}
+/* All basic blocks that are reachable only from unlikely basic blocks are
+ unlikely. */
+
+void
+propagate_unlikely_bbs_forward (void)
+{
+ auto_vec<basic_block, 64> worklist;
+ basic_block bb;
+ edge_iterator ei;
+ edge e;
+
+ if (!(ENTRY_BLOCK_PTR_FOR_FN (cfun)->count == profile_count::zero ()))
+ {
+ ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux = (void *)(size_t) 1;
+ worklist.safe_push (ENTRY_BLOCK_PTR_FOR_FN (cfun));
+
+ while (worklist.length () > 0)
+ {
+ bb = worklist.pop ();
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ if (!(e->count == profile_count::zero ())
+ && !(e->dest->count == profile_count::zero ())
+ && !e->dest->aux)
+ {
+ e->dest->aux = (void *)(size_t) 1;
+ worklist.safe_push (e->dest);
+ }
+ }
+ }
+
+ FOR_ALL_BB_FN (bb, cfun)
+ {
+ if (!bb->aux)
+ {
+ if (!(bb->count == profile_count::zero ())
+ && (dump_file && (dump_flags & TDF_DETAILS)))
+ fprintf (dump_file,
+ "Basic block %i is marked unlikely by forward prop\n",
+ bb->index);
+ bb->count = profile_count::zero ();
+ bb->frequency = 0;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ e->count = profile_count::zero ();
+ }
+ else
+ bb->aux = NULL;
+ }
+}
+
/* Determine basic blocks/edges that are known to be unlikely executed and set
their counters to zero.
This is done with first identifying obviously unlikely BBs/edges and then
@@ -3418,43 +3467,6 @@ determine_unlikely_bbs ()
gcc_checking_assert (!bb->aux);
}
- if (!(ENTRY_BLOCK_PTR_FOR_FN (cfun)->count == profile_count::zero ()))
- {
- ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux = (void *)(size_t) 1;
- worklist.safe_push (ENTRY_BLOCK_PTR_FOR_FN (cfun));
-
- while (worklist.length () > 0)
- {
- bb = worklist.pop ();
- FOR_EACH_EDGE (e, ei, bb->succs)
- if (!(e->count == profile_count::zero ())
- && !(e->dest->count == profile_count::zero ())
- && !e->dest->aux)
- {
- e->dest->aux = (void *)(size_t) 1;
- worklist.safe_push (e->dest);
- }
- }
- }
-
- FOR_ALL_BB_FN (bb, cfun)
- {
- if (!bb->aux)
- {
- if (!(bb->count == profile_count::zero ())
- && (dump_file && (dump_flags & TDF_DETAILS)))
- fprintf (dump_file,
- "Basic block %i is marked unlikely by forward prop\n",
- bb->index);
- bb->count = profile_count::zero ();
- bb->frequency = 0;
- FOR_EACH_EDGE (e, ei, bb->succs)
- e->count = profile_count::zero ();
- }
- else
- bb->aux = NULL;
- }
-
auto_vec<int, 64> nsuccs;
nsuccs.safe_grow_cleared (last_basic_block_for_fn (cfun));
FOR_ALL_BB_FN (bb, cfun)