OSDN Git Service

PR rtl-optimization/40101
authorabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 May 2009 15:33:17 +0000 (15:33 +0000)
committerabel <abel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 May 2009 15:33:17 +0000 (15:33 +0000)
        * sel-sched-ir.c (get_seqno_by_preds): Allow returning negative
        seqno.  Adjust comment.
        * sel-sched.c (find_seqno_for_bookkeeping): Assert that when
        inserting bookkeeping before a jump, the jump is not scheduled.
        When no positive seqno found, provide a value.  Add comment.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147977 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/sel-sched-ir.c
gcc/sel-sched.c

index 26ceb86..ce0ac90 100644 (file)
@@ -1,3 +1,12 @@
+2009-05-29  Andrey Belevantsev  <abel@ispras.ru>
+
+       PR rtl-optimization/40101
+       * sel-sched-ir.c (get_seqno_by_preds): Allow returning negative
+       seqno.  Adjust comment.
+       * sel-sched.c (find_seqno_for_bookkeeping): Assert that when 
+       inserting bookkeeping before a jump, the jump is not scheduled.
+       When no positive seqno found, provide a value.  Add comment.
+
 2009-05-29  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-alias.c (nonaliasing_component_refs_p): Remove
index d3f3562..655c873 100644 (file)
@@ -3730,7 +3730,8 @@ get_seqno_of_a_pred (insn_t insn)
   return seqno;
 }
 
-/*  Find the proper seqno for inserting at INSN.  */
+/*  Find the proper seqno for inserting at INSN.  Returns -1 if no predecessors
+    with positive seqno exist.  */
 int
 get_seqno_by_preds (rtx insn)
 {
@@ -3749,7 +3750,6 @@ get_seqno_by_preds (rtx insn)
   for (i = 0, seqno = -1; i < n; i++)
     seqno = MAX (seqno, INSN_SEQNO (preds[i]));
 
-  gcc_assert (seqno > 0);
   return seqno;
 }
 
index b1a33be..a7dedc5 100644 (file)
@@ -4524,11 +4524,27 @@ find_seqno_for_bookkeeping (insn_t place_to_insert, insn_t join_point)
   if (INSN_P (next) 
       && JUMP_P (next)
       && BLOCK_FOR_INSN (next) == BLOCK_FOR_INSN (place_to_insert))
-    seqno = INSN_SEQNO (next);
+    {
+      gcc_assert (INSN_SCHED_TIMES (next) == 0);
+      seqno = INSN_SEQNO (next);
+    }
   else if (INSN_SEQNO (join_point) > 0)
     seqno = INSN_SEQNO (join_point);
   else
-    seqno = get_seqno_by_preds (place_to_insert);
+    {
+      seqno = get_seqno_by_preds (place_to_insert);
+
+      /* Sometimes the fences can move in such a way that there will be 
+         no instructions with positive seqno around this bookkeeping.  
+         This means that there will be no way to get to it by a regular
+         fence movement.  Never mind because we pick up such pieces for
+         rescheduling anyways, so any positive value will do for now.  */
+      if (seqno < 0)
+        {
+          gcc_assert (pipelining_p);
+          seqno = 1;
+        }
+    }
   
   gcc_assert (seqno > 0);
   return seqno;