IA-64 speculation patches have bad impact on ARM

Paolo Bonzini paolo.bonzini@lu.unisi.ch
Tue May 30 18:58:00 GMT 2006


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



More information about the Gcc mailing list