summaryrefslogtreecommitdiff
path: root/gcc/haifa-sched.c
diff options
context:
space:
mode:
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2012-02-14 23:26:47 +0000
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2012-02-14 23:26:47 +0000
commit38d8f4bbb3cd8e99a8b8423cc7b19be338a1073a (patch)
tree8d227cbc0a5c0e3b40c96092b667476e44770a86 /gcc/haifa-sched.c
parent4a737c625c652bd552ea2da6885021776296d96c (diff)
downloadgcc-38d8f4bbb3cd8e99a8b8423cc7b19be338a1073a.tar.gz
* haifa-sched.c (prune_ready_list): Ensure that if there is a
sched-group insn, it either remains alone or the entire list is pruned. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184238 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/haifa-sched.c')
-rw-r--r--gcc/haifa-sched.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index d7d0b38ce1d..b6a8b0c8884 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -1,6 +1,6 @@
/* Instruction scheduling pass.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
and currently maintained by, Jim Wilson (wilson@cygnus.com)
@@ -3945,6 +3945,7 @@ prune_ready_list (state_t temp_state, bool first_cycle_insn_p,
bool shadows_only_p, bool modulo_epilogue_p)
{
int i;
+ bool sched_group_found = false;
restart:
for (i = 0; i < ready.n_ready; i++)
@@ -3953,13 +3954,27 @@ prune_ready_list (state_t temp_state, bool first_cycle_insn_p,
int cost = 0;
const char *reason = "resource conflict";
- if (modulo_epilogue_p && !DEBUG_INSN_P (insn)
- && INSN_EXACT_TICK (insn) == INVALID_TICK)
+ if (DEBUG_INSN_P (insn))
+ continue;
+
+ if (SCHED_GROUP_P (insn) && !sched_group_found)
+ {
+ sched_group_found = true;
+ if (i > 0)
+ goto restart;
+ }
+
+ if (sched_group_found && !SCHED_GROUP_P (insn))
+ {
+ cost = 1;
+ reason = "not in sched group";
+ }
+ else if (modulo_epilogue_p && INSN_EXACT_TICK (insn) == INVALID_TICK)
{
cost = max_insn_queue_index;
reason = "not an epilogue insn";
}
- if (shadows_only_p && !DEBUG_INSN_P (insn) && !SHADOW_P (insn))
+ else if (shadows_only_p && !SHADOW_P (insn))
{
cost = 1;
reason = "not a shadow";