]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix marking of SMSed loops as BB_DISABLE_SCHEDULE
authorRevital Eres <revital.eres@linaro.org>
Sun, 30 Oct 2011 05:12:53 +0000 (05:12 +0000)
committerRevital Eres <revitale@gcc.gnu.org>
Sun, 30 Oct 2011 05:12:53 +0000 (05:12 +0000)
From-SVN: r180673

gcc/ChangeLog
gcc/modulo-sched.c

index 82600547312fe3db44677e38d8442910362f91bc..0eb34e5efad126e2bd5f64d5e9fe05f07282a941 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 f2fd445fa0657633cda227ee9959bd52bd5cb1d2..0ea9a4d9a6281a416d3584e365b5955e470607a7 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);