Maxim Kuvyrkov wrote:
Anyway, this work is for stage 1 or 2 and for now I propose following
fix: implement targetm.sched.reorder hook so that it will ensure that if
there is an insn from the current block in the ready list, then insn
from the other block won't stand first in the line (and, therefore,
won't be chosen for schedule). I feel that this will be what you are
calling 'filling holes'. Please find an example patch attached
(arm.patch).
Do you think this could be a default implementation of the reorder hook,
like this? (After suitable performance testing. This looks O(n^2) to me).
--- in defaults.h ---
#ifndef TARGET_SCHED_REORDER
#define TARGET_SCHED_REORDER default_reorder
#endif
#ifndef TARGET_SCHED_REORDER2
#define TARGET_SCHED_REORDER2 default_reorder2
#endif
--- in targhooks.c ---
int
default_reorder (FILE *dump, int sched_verbose,
rtx *ready, int *pn_ready, int clock_var)
{
default_reorder2 (dump, sched_verbose, ready, pn_ready, clock_var);
if (targetm.sched.issue_rate)
return targetm.sched.issue_rate ();
else
return 1;
}
int
default_reorder2 (FILE *dump ATTRIBUTE_UNUSED,
int sched_verbose ATTRIBUTE_UNUSED,
rtx *ready, int *pn_ready,
int clock_var ATTRIBUTE_UNUSED)
{
int n_ready = *pn_ready;
/* This is correct for sched-rgn.c only. */
if (reload_completed
&& (flag_sched2_use_superblocks || flag_sched2_use_traces))
return 0;
if (n_ready > 1)
{
basic_block bb = BLOCK_FOR_INSN (current_sched_info->prev_head);
if (BLOCK_FOR_INSN (ready[n_ready - 1]) != bb)
{
int i;
for (i = n_ready - 1; i >= 0; i--)
{
rtx insn = ready[i];
if (BLOCK_FOR_INSN (insn) != bb)
continue;
memcpy (ready + i, ready + i + 1,
(n_ready - i - 1) * sizeof (*ready));
ready[n_ready - 1] = insn;
break;
}
}
}
return 0;
}
Paolo