http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55190



             Bug #: 55190

           Summary: [SH] ivopts causes loop setup bloat

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: enhancement

          Priority: P3

         Component: target

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: olege...@gcc.gnu.org

            Target: sh*-*-*





The following code:



struct X

{

  int a, b, c, d, e;

};



int test (X* x, unsigned int c)

{

  int s = 0;

  unsigned int i;

  for (i = 0; i < c; ++i)

    s += x[i].b;

  return s;

}



results in:

        tst     r5,r5

        bt/s    .L4

        mov     r5,r1

        shll2   r1

        add     r5,r1

        mov.l   .L9,r2

        shll2   r1

        add     #-20,r1

        shlr2   r1

        mul.l   r2,r1

        mov.l   .L10,r2

        add     #4,r4

        mov     #0,r0

        sts     macl,r1

        and     r2,r1

        add     #1,r1

.L3:

        mov.l   @r4,r2

        dt      r1

        add     #20,r4

        bf/s    .L3

        add     r2,r0

        rts

        nop

.L4:

        rts

        mov     #0,r0

.L11:

        .align 2

.L9:

        .long   214748365

.L10:

        .long   1073741823



In such cases, the loop counter setup code that seems to be produced by ivopts

can be left out, which would result in something like:



        tst     r5,r5

        bt/s    .L15

        add     #4,r4

        mov     #0,r0

.L14:

        mov.l   @r4,r1

        dt      r5

        add     #20,r4

        bf/s    .L14

        add     r1,r0

        rts

        nop

.L15:

        rts

        mov     #0,r0

Reply via email to