From e7ea26b5c5763bf0669131fe6e55acda22776999 Mon Sep 17 00:00:00 2001 From: abel Date: Wed, 22 Dec 2010 07:46:53 +0000 Subject: PR rtl-optimization/45352 PR rtl-optimization/46521 PR rtl-optimization/46522 * sel-sched.c (reset_sched_cycles_in_current_ebb): Recheck the DFA state on the last iteration of the advancing loop. (sel_sched_region_1): Propagate the rescheduling bit to the next block also for empty blocks. * gcc.dg/pr46521.c: New. * gcc.dg/pr46522.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168164 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/sel-sched.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'gcc/sel-sched.c') diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c index 3b5603c7efa..edd6cb9d3cd 100644 --- a/gcc/sel-sched.c +++ b/gcc/sel-sched.c @@ -7053,7 +7053,17 @@ reset_sched_cycles_in_current_ebb (void) && haifa_cost > 0 && estimate_insn_cost (insn, curr_state) == 0) break; - } + + /* When the data dependency stall is longer than the DFA stall, + it could be that after the longer stall the insn will again + become unavailable to the DFA restrictions. Looks strange + but happens e.g. on x86-64. So recheck DFA on the last + iteration. */ + if (after_stall + && real_insn + && haifa_cost == 0) + haifa_cost = estimate_insn_cost (insn, curr_state); + } haifa_clock += i; if (sched_verbose >= 2) @@ -7504,21 +7514,23 @@ sel_sched_region_1 (void) { basic_block bb = EBB_FIRST_BB (i); - if (sel_bb_empty_p (bb)) - { - bitmap_clear_bit (blocks_to_reschedule, bb->index); - continue; - } - if (bitmap_bit_p (blocks_to_reschedule, bb->index)) { + if (! bb_ends_ebb_p (bb)) + bitmap_set_bit (blocks_to_reschedule, bb_next_bb (bb)->index); + if (sel_bb_empty_p (bb)) + { + bitmap_clear_bit (blocks_to_reschedule, bb->index); + continue; + } clear_outdated_rtx_info (bb); if (sel_insn_is_speculation_check (BB_END (bb)) && JUMP_P (BB_END (bb))) bitmap_set_bit (blocks_to_reschedule, BRANCH_EDGE (bb)->dest->index); } - else if (INSN_SCHED_TIMES (sel_bb_head (bb)) <= 0) + else if (! sel_bb_empty_p (bb) + && INSN_SCHED_TIMES (sel_bb_head (bb)) <= 0) bitmap_set_bit (blocks_to_reschedule, bb->index); } -- cgit v1.2.3