aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrey Belevantsev <abel@ispras.ru>2012-03-06 11:31:43 +0400
committerAndrey Belevantsev <abel@gcc.gnu.org>2012-03-06 11:31:43 +0400
commitb7b5540a8ae6d202ed0bc70b16c2d6170a8d9221 (patch)
tree4f08c35eb91869fad11237316386d682a7dc8227 /gcc
parentd9b804873742e73c36e1c8294242c7ace25f5d3c (diff)
downloadgcc-b7b5540a8ae6d202ed0bc70b16c2d6170a8d9221.zip
gcc-b7b5540a8ae6d202ed0bc70b16c2d6170a8d9221.tar.gz
gcc-b7b5540a8ae6d202ed0bc70b16c2d6170a8d9221.tar.bz2
re PR rtl-optimization/52250 (ICE: in sel_remove_bb, at sel-sched-ir.c:5213 with -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fselective-scheduling2 and other flags)
PR rtl-optimization/52250 * sel-sched-ir.c (maybe_tidy_empty_bb): Try harder to find a bb to put note list into. Unconditionally call move_bb_info. (move_bb_info): Do not assert the blocks being in the same region, just drop the note list if they are not. From-SVN: r184975
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/sel-sched-ir.c26
2 files changed, 25 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2f10f58..14f0040 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2012-03-06 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/52250
+ * sel-sched-ir.c (maybe_tidy_empty_bb): Try harder to find a bb
+ to put note list into. Unconditionally call move_bb_info.
+ (move_bb_info): Do not assert the blocks being in the same region,
+ just drop the note list if they are not.
+
2012-03-06 Oleg Endo <olegendo@gcc.gnu.org>
PR target/51244
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index a93cd68..c53d2e1 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -3658,7 +3658,7 @@ sel_recompute_toporder (void)
static bool
maybe_tidy_empty_bb (basic_block bb)
{
- basic_block succ_bb, pred_bb;
+ basic_block succ_bb, pred_bb, note_bb;
VEC (basic_block, heap) *dom_bbs;
edge e;
edge_iterator ei;
@@ -3697,6 +3697,17 @@ maybe_tidy_empty_bb (basic_block bb)
pred_bb = NULL;
dom_bbs = NULL;
+ /* Save a pred/succ from the current region to attach the notes to. */
+ note_bb = NULL;
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ if (in_current_region_p (e->src))
+ {
+ note_bb = e->src;
+ break;
+ }
+ if (note_bb == NULL)
+ note_bb = succ_bb;
+
/* Redirect all non-fallthru edges to the next bb. */
while (rescan_p)
{
@@ -3746,10 +3757,8 @@ maybe_tidy_empty_bb (basic_block bb)
else
{
/* This is a block without fallthru predecessor. Just delete it. */
- gcc_assert (pred_bb != NULL);
-
- if (in_current_region_p (pred_bb))
- move_bb_info (pred_bb, bb);
+ gcc_assert (note_bb);
+ move_bb_info (note_bb, bb);
remove_empty_bb (bb, true);
}
@@ -5231,10 +5240,9 @@ sel_remove_bb (basic_block bb, bool remove_from_cfg_p)
static void
move_bb_info (basic_block merge_bb, basic_block empty_bb)
{
- gcc_assert (in_current_region_p (merge_bb));
-
- concat_note_lists (BB_NOTE_LIST (empty_bb),
- &BB_NOTE_LIST (merge_bb));
+ if (in_current_region_p (merge_bb))
+ concat_note_lists (BB_NOTE_LIST (empty_bb),
+ &BB_NOTE_LIST (merge_bb));
BB_NOTE_LIST (empty_bb) = NULL_RTX;
}