diff options
author | Maxim Kuvyrkov <mkuvyrkov@ispras.ru> | 2006-08-17 08:48:37 +0000 |
---|---|---|
committer | Maxim Kuvyrkov <mkuvyrkov@gcc.gnu.org> | 2006-08-17 08:48:37 +0000 |
commit | d3b30e42b73d0a369046e53fcdbe69517c0195be (patch) | |
tree | bad9e0947d0370b8e14e1ea87041d779fe235cdb /gcc/sched-ebb.c | |
parent | 2052721560b2329471c637b4d20f8fef44363004 (diff) | |
download | gcc-d3b30e42b73d0a369046e53fcdbe69517c0195be.tar.gz |
re PR rtl-optimization/28489 (ICE in move_insn, at haifa-sched.c:1968)
2006-08-17 Maxim Kuvyrkov <mkuvyrkov@ispras.ru>
PR rtl-optimization/28489
* sched-ebb.c (begin_schedule_ready): Create basic block
at the right place.
(advance_target_bb): Skip empty blocks.
* haifa-sched.c (bb_note): Make global.
* sched-int.h (bb_note): Add prototype.
2006-08-17 Maxim Kuvyrkov <mkuvyrkov@ispras.ru>
PR rtl-optimization/28489
* gcc.c-torture/compile/pr28489.c: New test.
From-SVN: r116214
Diffstat (limited to 'gcc/sched-ebb.c')
-rw-r--r-- | gcc/sched-ebb.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/gcc/sched-ebb.c b/gcc/sched-ebb.c index d7a3db9b61d..b220348da7b 100644 --- a/gcc/sched-ebb.c +++ b/gcc/sched-ebb.c @@ -166,7 +166,8 @@ begin_schedule_ready (rtx insn, rtx last) gcc_assert (NOTE_INSN_BASIC_BLOCK_P (BB_END (bb))); } else - bb = create_basic_block (insn, 0, last_bb); + /* Create an empty unreachable block after the INSN. */ + bb = create_basic_block (NEXT_INSN (insn), NULL_RTX, last_bb); /* split_edge () creates BB before E->DEST. Keep in mind, that this operation extends scheduling region till the end of BB. @@ -728,10 +729,19 @@ advance_target_bb (basic_block bb, rtx insn) else return 0; } - else if (bb != last_bb) - return bb->next_bb; else - gcc_unreachable (); + /* Return next non empty block. */ + { + do + { + gcc_assert (bb != last_bb); + + bb = bb->next_bb; + } + while (bb_note (bb) == BB_END (bb)); + + return bb; + } } /* Fix internal data after interblock movement of jump instruction. |