summaryrefslogtreecommitdiff
path: root/gcc/sel-sched.c
diff options
context:
space:
mode:
authorabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-13 09:29:09 +0000
committerabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-13 09:29:09 +0000
commit946d6c2b8307bc5625cc37318c4dd3d7a03f581e (patch)
treecb941e6d58e77747c98467338a3b6ee849918d99 /gcc/sel-sched.c
parentc6d146ce4eef9622975b4a6942c34db1d020d687 (diff)
downloadgcc-946d6c2b8307bc5625cc37318c4dd3d7a03f581e.tar.gz
PR rtl-optimization/45352
* sel-sched.c: Update copyright years. (reset_sched_cycles_in_current_ebb): Also recheck the DFA state in the advancing loop when we have issued issue_rate insns. * gcc.dg/pr45352-3.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168742 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sel-sched.c')
-rw-r--r--gcc/sel-sched.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 791adf1f6a8..d40885c95cf 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -1,5 +1,6 @@
/* Instruction scheduling pass. Selective scheduler and pipeliner.
- Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
+ Free Software Foundation, Inc.
This file is part of GCC.
@@ -6988,7 +6989,7 @@ reset_sched_cycles_in_current_ebb (void)
{
int cost, haifa_cost;
int sort_p;
- bool asm_p, real_insn, after_stall;
+ bool asm_p, real_insn, after_stall, all_issued;
int clock;
if (!INSN_P (insn))
@@ -7024,8 +7025,8 @@ reset_sched_cycles_in_current_ebb (void)
haifa_cost = cost;
after_stall = 1;
}
- if (haifa_cost == 0
- && issued_insns == issue_rate)
+ all_issued = issued_insns == issue_rate;
+ if (haifa_cost == 0 && all_issued)
haifa_cost = 1;
if (haifa_cost > 0)
{
@@ -7053,11 +7054,12 @@ reset_sched_cycles_in_current_ebb (void)
break;
/* When the data dependency stall is longer than the DFA stall,
- it could be that after the longer stall the insn will again
+ and when we have issued exactly issue_rate insns and stalled,
+ it could be that after this 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
+ if ((after_stall || all_issued)
&& real_insn
&& haifa_cost == 0)
haifa_cost = estimate_insn_cost (insn, curr_state);