OSDN Git Service

Fix marking of SMSed loops as BB_DISABLE_SCHEDULE
authorrevitale <revitale@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 30 Oct 2011 05:12:53 +0000 (05:12 +0000)
committerrevitale <revitale@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 30 Oct 2011 05:12:53 +0000 (05:12 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180673 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/modulo-sched.c

index 8260054..0eb34e5 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-30  Revital Eres  <revital.eres@linaro.org>
+
+       * modulo-sched.c (generate_prolog_epilog): Mark prolog and epilog
+       as BB_DISABLE_SCHEDULE.
+       (mark_loop_unsched): New function.
+       (sms_schedule): Call it.
+
 2011-10-29  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR target/50617
index f2fd445..0ea9a4d 100644 (file)
@@ -1173,6 +1173,8 @@ generate_prolog_epilog (partial_schedule_ptr ps, struct loop *loop,
   /* Put the prolog on the entry edge.  */
   e = loop_preheader_edge (loop);
   split_edge_and_insert (e, get_insns ());
+  if (!flag_resched_modulo_sched)
+    e->dest->flags |= BB_DISABLE_SCHEDULE;
 
   end_sequence ();
 
@@ -1186,9 +1188,24 @@ generate_prolog_epilog (partial_schedule_ptr ps, struct loop *loop,
   gcc_assert (single_exit (loop));
   e = single_exit (loop);
   split_edge_and_insert (e, get_insns ());
+  if (!flag_resched_modulo_sched)
+    e->dest->flags |= BB_DISABLE_SCHEDULE;
+
   end_sequence ();
 }
 
+/* Mark LOOP as software pipelined so the later
+   scheduling passes don't touch it.  */
+static void
+mark_loop_unsched (struct loop *loop)
+{
+  unsigned i;
+  basic_block *bbs = get_loop_body (loop);
+
+  for (i = 0; i < loop->num_nodes; i++)
+    bbs[i]->flags |= BB_DISABLE_SCHEDULE;
+}
+
 /* Return true if all the BBs of the loop are empty except the
    loop header.  */
 static bool
@@ -1714,9 +1731,10 @@ sms_schedule (void)
          permute_partial_schedule (ps, g->closing_branch->first_note);
 
           /* Mark this loop as software pipelined so the later
-            scheduling passes doesn't touch it.  */
+            scheduling passes don't touch it.  */
          if (! flag_resched_modulo_sched)
-           g->bb->flags |= BB_DISABLE_SCHEDULE;
+           mark_loop_unsched (loop);
+         
          /* The life-info is not valid any more.  */
          df_set_bb_dirty (g->bb);