haifa-sched.c (prune_ready_list): Ensure that if there is a sched-group insn...

* 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.

From-SVN: r184238
This commit is contained in:
Bernd Schmidt 2012-02-14 23:26:47 +00:00 committed by Bernd Schmidt
parent 5cd3514cdd
commit b75f962c90
2 changed files with 25 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2012-02-15 Bernd Schmidt <bernds@codesourcery.com>
* 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.
2012-02-14 Jonathan Wakely <jwakely.gcc@gmail.com>
* doc/install.texi (Prerequisites): Fix grammar.

View File

@ -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";