diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 6 | ||||
-rw-r--r-- | gcc/haifa-sched.c | 44 | ||||
-rw-r--r-- | gcc/params.def | 6 | ||||
-rw-r--r-- | gcc/params.h | 2 |
5 files changed, 66 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 570342cc02b..08b8f29f941 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 7f561d2c753..7080aacf8bb 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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. diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index ef4f4f709ca..6368ec6b666 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -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); diff --git a/gcc/params.def b/gcc/params.def index 69241e77814..84f16e294af 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -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 diff --git a/gcc/params.h b/gcc/params.h index aafafe17ff3..32c9c8c63fa 100644 --- a/gcc/params.h +++ b/gcc/params.h @@ -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 */ |