params.def (PARAM_MAX_SCHED_READY_INSNS): New parameter, defaulting to 100.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 14 Apr 2006 00:07:48 +0000 (00:07 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 14 Apr 2006 00:07:48 +0000 (00:07 +0000)
* params.def (PARAM_MAX_SCHED_READY_INSNS): New parameter,
defaulting to 100.
* params.h (MAX_SCHED_READY_INSNS): New macro.
* haifa-sched.c: (queue_to_ready): Re-queue insns for the next cycle
past MAX_SCHED_READY_INSNS during the first scheduling pass.
(schedule_block): Delay insns past MAX_SCHED_READY_INSNS in
the ready list for 1 cycle during the first scheduling pass.
* doc/invoke.texi (--param): New parameter max-sched-ready-insns.

From-SVN: r112936

gcc/ChangeLog
gcc/doc/invoke.texi
gcc/haifa-sched.c
gcc/params.def
gcc/params.h

index 570342cc02b6ca48d662452128d5771b7c6da667..08b8f29f941c4e4086de47344fd31021fd035f46 100644 (file)
@@ -1,3 +1,14 @@
+2006-04-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * params.def (PARAM_MAX_SCHED_READY_INSNS): New parameter,
+       defaulting to 100.
+       * params.h (MAX_SCHED_READY_INSNS): New macro.
+       * haifa-sched.c: (queue_to_ready): Re-queue insns for the next cycle
+       past MAX_SCHED_READY_INSNS during the first scheduling pass.
+       (schedule_block): Delay insns past MAX_SCHED_READY_INSNS in
+       the ready list for 1 cycle during the first scheduling pass.
+       * doc/invoke.texi (--param): New parameter max-sched-ready-insns.
+
 2006-04-13  Richard Henderson  <rth@redhat.com>
 
        PR 26651
index 7f561d2c753ce45389ad290eaa714191911fe315..7080aacf8bbdcfe1025778955c44344cefe45ae1 100644 (file)
@@ -6191,6 +6191,12 @@ feedback is available and may be set to higher values than
 @option{reorder-block-duplicate} since information about the hot spots is more
 accurate.
 
+@item max-sched-ready-insns
+The maximum number of instructions ready to be issued the scheduler should
+consider at any given time during the first scheduling pass.  Increasing
+values mean more thorough searches, making the compilation time increase
+with probably little benefit.  The default value is 100.
+
 @item max-sched-region-blocks
 The maximum number of blocks in a region to be considered for
 interblock scheduling.  The default value is 10.
index ef4f4f709cad67b13d9662761e168f2090477078..6368ec6b6664f82bcfb02309ba1d70f9c43a0dd9 100644 (file)
@@ -1655,9 +1655,22 @@ queue_to_ready (struct ready_list *ready)
        fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
                 (*current_sched_info->print_insn) (insn, 0));
 
-      ready_add (ready, insn, false);
-      if (sched_verbose >= 2)
-       fprintf (sched_dump, "moving to ready without stalls\n");
+      /* If the ready list is full, delay the insn for 1 cycle.
+        See the comment in schedule_block for the rationale.  */
+      if (!reload_completed
+         && ready->n_ready > MAX_SCHED_READY_INSNS
+         && !SCHED_GROUP_P (insn))
+       {
+         if (sched_verbose >= 2)
+           fprintf (sched_dump, "requeued because ready full\n");
+         queue_insn (insn, 1);
+       }
+      else
+       {
+         ready_add (ready, insn, false);
+         if (sched_verbose >= 2)
+           fprintf (sched_dump, "moving to ready without stalls\n");
+        }
     }
   free_INSN_LIST_list (&insn_queue[q_ptr]);
 
@@ -2292,6 +2305,31 @@ schedule_block (basic_block *target_bb, int rgn_n_insns1)
      in try_ready () (which is called through init_ready_list ()).  */
   (*current_sched_info->init_ready_list) ();
 
+  /* The algorithm is O(n^2) in the number of ready insns at any given
+     time in the worst case.  Before reload we are more likely to have
+     big lists so truncate them to a reasonable size.  */
+  if (!reload_completed && ready.n_ready > MAX_SCHED_READY_INSNS)
+    {
+      ready_sort (&ready);
+
+      /* Find first free-standing insn past MAX_SCHED_READY_INSNS.  */
+      for (i = MAX_SCHED_READY_INSNS; i < ready.n_ready; i++)
+       if (!SCHED_GROUP_P (ready_element (&ready, i)))
+         break;
+
+      if (sched_verbose >= 2)
+       {
+         fprintf (sched_dump,
+                  ";;\t\tReady list on entry: %d insns\n", ready.n_ready);
+         fprintf (sched_dump,
+                  ";;\t\t before reload => truncated to %d insns\n", i);
+       }
+
+      /* Delay all insns past it for 1 cycle.  */
+      while (i < ready.n_ready)
+       queue_insn (ready_remove (&ready, i), 1);
+    }
+
   /* Now we can restore basic block notes and maintain precise cfg.  */
   restore_bb_notes (*target_bb);
 
index 69241e77814460e6893c367f72556a244f0b498c..84f16e294af604dc459a994bb7f0757c5d6715f3 100644 (file)
@@ -582,6 +582,12 @@ DEFPARAM (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
           "max-fields-for-field-sensitive",
          "Maximum number of fields in a structure before pointer analysis treats the structure as a single variable",
          100, 0, 0)
+
+DEFPARAM(PARAM_MAX_SCHED_READY_INSNS,
+        "max-sched-ready-insns",
+        "The maximum number of instructions ready to be issued to be considered by the scheduler during the first scheduling pass",
+        100, 0, 0)
+
 /*
 Local variables:
 mode:c
index aafafe17ff3dbd8d6bb608152a15034e80294074..32c9c8c63faf9e6268b40f96f12798d56b20f168 100644 (file)
@@ -149,4 +149,6 @@ typedef enum compiler_param
   PARAM_VALUE (PARAM_VIRTUAL_MAPPINGS_TO_SYMS_RATIO)
 #define MAX_FIELDS_FOR_FIELD_SENSITIVE \
   ((size_t) PARAM_VALUE (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE))
+#define MAX_SCHED_READY_INSNS \
+  PARAM_VALUE (PARAM_MAX_SCHED_READY_INSNS)
 #endif /* ! GCC_PARAMS_H */