Re: Unable to remove pipeline stalls

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 18, 2012 at 9:03 PM, Deepti Sharma
<deepti.gccretarget@xxxxxxxxx> wrote:
>
> As we see above, the scheduler is not able to reschedule the instructions to
> remove stalls.
> I understand that the removal of stalls is performed by scheduler-pass1
> (sched1).
> However, since the scheduler1 is receiving the instruction as a single
> instruction "[r62++]=[r63++]",
> it does not know that it is later broken down into two MOVE operations.

Yes, it would be better if it could know that.

> I don't have a define_split pattern for MOVE. I have a define_expand, like
> below:


> (define_insn "*movsi"
>   [(set (match_operand:SI 0 "nonimmediate_operand" "=z,z,x,x, xz,co1 ")
>         (match_operand:SI 1 "general_operand"      " z,x,z,x, co1,xz "))]
>   ""
>   "@
>   MOV %0, %1
>   MOVE %0, %1
>   MOVE %0, %1
>   MOVE %0, %1
>   MOVE %0, %1
>   MOVE %0, %1"
>   [(set_attr "ATTR1" "mem1, mem1, mem1, mem1, mem1, mem1")
>    (set_attr "ATTR2" "none, op1, op1, op1, op2, op1")])

This approach implies that you are relying on reload to see that there
is no memory-to-memory move, and to allocate a register to do the load
and store.  It would be better to handle this in the define_expand.
Most targets do something like
    if (!register_operand (operands[0], SImode) && !register_operand
(operands[1], SImode))
      operands[1] = force_reg (operands[1], SImode);

Ian


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux