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
This commit is contained in:
parent
777f7f9a72
commit
6f8dd94be5
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue