Patchwork Scheduler cleanups, 1/N

login
register
mail settings
Submitter Alexandre Oliva
Date April 29, 2011, 5:14 a.m.
Message ID <orzkn9oczx.fsf@livre.localdomain>
Download mbox | patch
Permalink /patch/93377/
State New
Headers show

Comments

Alexandre Oliva - April 29, 2011, 5:14 a.m.
On Apr  5, 2011, Alexandre Oliva <aoliva@redhat.com> wrote:

>> +  if (flag_sched_last_insn_heuristic
>> +      && NONDEBUG_INSN_P (last_nondebug_scheduled_insn))

>> Isn't that always true now

> Not if it's the initial NOTE.

>> (except we should probably initialize it to NULL_RTX and check for
>> that here)?

> Good idea.  Will try that, retest, and apply if it passes.

Here's what I'm (finally) installing, regstrapped several times on
x86_64-linux-gnu and i686-pc-linux-gnu.

Patch

for  gcc/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	* haifa-sched.c (last_nondebug_scheduled_insn): New.
	(rank_for_schedule): Use it.
	(schedule_block): Set it.
	
Index: gcc/haifa-sched.c
===================================================================
--- gcc/haifa-sched.c.orig	2011-04-05 05:29:27.910000535 -0300
+++ gcc/haifa-sched.c	2011-04-05 19:37:59.224096719 -0300
@@ -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 
 {
   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 
   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)
 	    {