haifa-sched.c (last_nondebug_scheduled_insn): New.
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 29 Apr 2011 05:22:08 +0000 (05:22 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 29 Apr 2011 05:22:08 +0000 (05:22 +0000)
* haifa-sched.c (last_nondebug_scheduled_insn): New.
(rank_for_schedule): Use it.
(schedule_block): Set it.

From-SVN: r173150

gcc/ChangeLog
gcc/haifa-sched.c

index fdbc4f1212e863b9fee25e3091788ee1c5ec29ff..5bb003794073ad1ceed66329309045c96f5dcc47 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-29  Alexandre Oliva  <aoliva@redhat.com>
+
+       * haifa-sched.c (last_nondebug_scheduled_insn): New.
+       (rank_for_schedule): Use it.
+       (schedule_block): Set it.
+
 2011-04-28  David Li  <davidxl@google.com>
 
        * tree.c (crc32_string): Use crc32_byte.
index d67aee8f827a58843e6d47d661018698e1de903e..15d8f65375f8d1e4fac971dd3095004dd4e3bdef 100644 (file)
@@ -783,6 +783,12 @@ print_curr_reg_pressure (void)
 /* Pointer to the last instruction scheduled.  */
 static rtx last_scheduled_insn;
 
+/* Pointer to the last nondebug instruction scheduled within the
+   block, or the prev_head of the scheduling block.  Used by
+   rank_for_schedule, so that insns independent of the last scheduled
+   insn will be preferred over dependent instructions.  */
+static rtx last_nondebug_scheduled_insn;
+
 /* Pointer that iterates through the list of unscheduled insns if we
    have a dbg_cnt enabled.  It always points at an insn prior to the
    first unscheduled one.  */
@@ -1158,7 +1164,6 @@ rank_for_schedule (const void *x, const void *y)
 {
   rtx tmp = *(const rtx *) y;
   rtx tmp2 = *(const rtx *) x;
-  rtx last;
   int tmp_class, tmp2_class;
   int val, priority_val, info_val;
 
@@ -1239,24 +1244,13 @@ rank_for_schedule (const void *x, const void *y)
   if(flag_sched_rank_heuristic && info_val)
     return info_val;
 
-  if (flag_sched_last_insn_heuristic)
-    {
-      int i = VEC_length (rtx, scheduled_insns);
-      last = NULL_RTX;
-      while (i-- > 0)
-       {
-         last = VEC_index (rtx, scheduled_insns, i);
-         if (NONDEBUG_INSN_P (last))
-           break;
-       }
-    }
-
   /* Compare insns based on their relation to the last scheduled
      non-debug insn.  */
-  if (flag_sched_last_insn_heuristic && last && NONDEBUG_INSN_P (last))
+  if (flag_sched_last_insn_heuristic && last_nondebug_scheduled_insn)
     {
       dep_t dep1;
       dep_t dep2;
+      rtx last = last_nondebug_scheduled_insn;
 
       /* Classify the instructions into three classes:
          1) Data dependent on last schedule insn.
@@ -2967,6 +2961,7 @@ schedule_block (basic_block *target_bb)
 
   /* We start inserting insns after PREV_HEAD.  */
   last_scheduled_insn = nonscheduled_insns_begin = prev_head;
+  last_nondebug_scheduled_insn = NULL_RTX;
 
   gcc_assert ((NOTE_P (last_scheduled_insn)
               || DEBUG_INSN_P (last_scheduled_insn))
@@ -3226,7 +3221,8 @@ schedule_block (basic_block *target_bb)
          /* Update counters, etc in the scheduler's front end.  */
          (*current_sched_info->begin_schedule_ready) (insn);
          VEC_safe_push (rtx, heap, scheduled_insns, insn);
-         last_scheduled_insn = insn;
+         gcc_assert (NONDEBUG_INSN_P (insn));
+         last_nondebug_scheduled_insn = last_scheduled_insn = insn;
 
          if (recog_memoized (insn) >= 0)
            {