aboutsummaryrefslogtreecommitdiff
path: root/gcc/sel-sched.c
diff options
context:
space:
mode:
authorabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-22 07:46:53 +0000
committerabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-22 07:46:53 +0000
commite7ea26b5c5763bf0669131fe6e55acda22776999 (patch)
tree82073ce3ad5d93cd8db010086551d856ac634f10 /gcc/sel-sched.c
parentb0d311a11377ab09857ef14f92b9ba7747cc4993 (diff)
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
Diffstat (limited to 'gcc/sel-sched.c')
-rw-r--r--gcc/sel-sched.c28
1 files changed, 20 insertions, 8 deletions
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);
}