Commit 6f8dd94b by Eric Botcazou Committed by Eric Botcazou

params.def (PARAM_MAX_SCHED_READY_INSNS): New parameter, defaulting to 100.

	* 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
parent 777f7f9a
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> 2006-04-13 Richard Henderson <rth@redhat.com>
PR 26651 PR 26651
......
...@@ -6191,6 +6191,12 @@ feedback is available and may be set to higher values than ...@@ -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 @option{reorder-block-duplicate} since information about the hot spots is more
accurate. 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 @item max-sched-region-blocks
The maximum number of blocks in a region to be considered for The maximum number of blocks in a region to be considered for
interblock scheduling. The default value is 10. interblock scheduling. The default value is 10.
......
...@@ -1655,10 +1655,23 @@ queue_to_ready (struct ready_list *ready) ...@@ -1655,10 +1655,23 @@ queue_to_ready (struct ready_list *ready)
fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ", fprintf (sched_dump, ";;\t\tQ-->Ready: insn %s: ",
(*current_sched_info->print_insn) (insn, 0)); (*current_sched_info->print_insn) (insn, 0));
/* 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); ready_add (ready, insn, false);
if (sched_verbose >= 2) if (sched_verbose >= 2)
fprintf (sched_dump, "moving to ready without stalls\n"); fprintf (sched_dump, "moving to ready without stalls\n");
} }
}
free_INSN_LIST_list (&insn_queue[q_ptr]); free_INSN_LIST_list (&insn_queue[q_ptr]);
/* If there are no ready insns, stall until one is ready and add all /* If there are no ready insns, stall until one is ready and add all
...@@ -2292,6 +2305,31 @@ schedule_block (basic_block *target_bb, int rgn_n_insns1) ...@@ -2292,6 +2305,31 @@ schedule_block (basic_block *target_bb, int rgn_n_insns1)
in try_ready () (which is called through init_ready_list ()). */ in try_ready () (which is called through init_ready_list ()). */
(*current_sched_info->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. */ /* Now we can restore basic block notes and maintain precise cfg. */
restore_bb_notes (*target_bb); restore_bb_notes (*target_bb);
......
...@@ -582,6 +582,12 @@ DEFPARAM (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE, ...@@ -582,6 +582,12 @@ DEFPARAM (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
"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", "Maximum number of fields in a structure before pointer analysis treats the structure as a single variable",
100, 0, 0) 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: Local variables:
mode:c mode:c
......
...@@ -149,4 +149,6 @@ typedef enum compiler_param ...@@ -149,4 +149,6 @@ typedef enum compiler_param
PARAM_VALUE (PARAM_VIRTUAL_MAPPINGS_TO_SYMS_RATIO) PARAM_VALUE (PARAM_VIRTUAL_MAPPINGS_TO_SYMS_RATIO)
#define MAX_FIELDS_FOR_FIELD_SENSITIVE \ #define MAX_FIELDS_FOR_FIELD_SENSITIVE \
((size_t) PARAM_VALUE (PARAM_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 */ #endif /* ! GCC_PARAMS_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment