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