On Thu, Dec 3, 2015 at 7:01 PM, Steve Ellcey <sell...@imgtec.com> wrote:
> Can the instruction scheduler actually rewrite instructions?  I didn't
> think so but when I compile some code on MIPS with:
>
>         -O2 -fno-ivopts -fno-peephole2 -fno-schedule-insns2
>
> I get:
>
> $L4:
>         lbu     $3,0($4)
>         addiu   $4,$4,1
>         lbu     $2,0($5)
>         beq     $3,$0,$L7
>         addiu   $5,$5,1
>
>         beq     $3,$2,$L4
>         subu    $2,$3,$2
>
> When I changed -fno-schedule-insns2 to -fschedule-insns2, I get:
>
> $L4:
>         lbu     $3,0($4)
>         addiu   $5,$5,1
>         lbu     $2,-1($5)
>         beq     $3,$0,$L7
>         addiu   $4,$4,1
>
>         beq     $3,$2,$L4
>         subu    $2,$3,$2
>
> I.e. The addiu of $5 and the load using $5 have been swapped around
> and the load uses a different offset to compensate.  I can't see
> where in the instruction scheduler that this would happen.  Any
> help?  This is on MIPS if that matters, though I didn't see any
> MIPS specific code for this.  This issue is related to my earlier
> question about PR 48814 and ivopts (thus the -fno-ivopts option).

IIRC it's because the scheduler *thinks* it can get a tighter schedule
- probably because it thinks it can dual issue the lbu from $4 and the
addiu to $5. Can it think so ? This may be related -
https://gcc.gnu.org/ml/gcc-patches/2012-08/msg00155.html

regards
Ramana



>
> The C code I am looking at is the strcmp function from glibc:
>
> int
> strcmp (const char *p1, const char *p2)
> {
>   const unsigned char *s1 = (const unsigned char *) p1;
>   const unsigned char *s2 = (const unsigned char *) p2;
>   unsigned char c1, c2;
>
>   do
>     {
>       c1 = (unsigned char) *s1++;
>       c2 = (unsigned char) *s2++;
>       if (c1 == '\0')
>         return c1 - c2;
>     }
>   while (c1 == c2);
>
>   return c1 - c2;
> }
>
>
> Steve Ellcey
> sell...@imgtec.com

Reply via email to