[Bug target/62233] unnecessary shift instructions to prepare loop counter
olegendo at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Sep 25 19:18:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62233
Oleg Endo <olegendo at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target|powerpc64le |powerpc64le sh*-*-*
Status|UNCONFIRMED |NEW
Last reconfirmed| |2014-09-25
CC| |olegendo at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #2 from Oleg Endo <olegendo at gcc dot gnu.org> ---
On SH, the original code above looks OK (no extra shifts generated), however,
changing it to:
void clear2 (S* s )
{
int i;
int len = s->l;
int* p = s->b;
for (i = 0; i < len; i++)
p[i] = 0;
}
results in:
mov.l @r4,r1
cmp/pl r1
bf/s .L13
add #4,r4 <<<<
shll2 r1 <<<<
add #-4,r1 <<<<
shlr2 r1 <<<<
mov #0,r2
add #1,r1
.align 2
.L10:
mov.l r2,@r4
dt r1
bf/s .L10
add #4,r4
.L13:
rts
nop
This looks very similar to what is happening in PR 55190.
BTW, compiling the two functions with -O3 results in a detected memset, while
at -O2 a memset is not detected.
More information about the Gcc-bugs
mailing list