]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* haifa-sched.c (prune_ready_list): Ensure that if there is a
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Feb 2012 23:26:47 +0000 (23:26 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Feb 2012 23:26:47 +0000 (23:26 +0000)
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

gcc/ChangeLog
gcc/haifa-sched.c

index fe125446d566b7d0758b7606517e7456aa61fa57..1536017e43f391e9a90f1d55f90b8e5ceeb642d4 100644 (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.
index d7d0b38ce1dec03a01a33a8226f507dc05a10ded..b6a8b0c8884a4eda9850891481bb19fbad918326 100644 (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";