http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50417
Oleg Endo <olegendo at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target| |sh*-*-* arm*-*-* avr*-*-*
Status|UNCONFIRMED |NEW
Last reconfirmed| |2013-07-14
CC| |olegendo at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #3 from Oleg Endo <olegendo at gcc dot gnu.org> ---
I ran into this issue when trying out something on SH, too.
(4.9 trunk rev 200571)
Example:
void test (const int* a, int* b)
{
std::memcpy (b, a, 4);
}
Here I'd have expected this to result in a int load + int store, like...
mov.l @r4,r1
rts
mov.l r1,@r5
However, this does not happen. The SH's movmemsi pattern gets a 'common
alignment' of '1'. SH is a strict alignment target and thus the expander will
fall back to memcpy library call.
If I remember correctly, on strict alignment targets a pointer to some type is
by default assumed to satisfy the minimum alignment of that type.
For example
int test (const int* a)
{
return a[0];
}
resuls in (as expected):
rts
mov.l @r4,r0
In the memcpy case it should be safe to assume that the alignment of int* is 32
bit aligned.
As it has been mentioned in PR 52415, I've also tried out
__builtin_assume_aligned and the problem disappears. In this case the memcpy
is eliminated early on and the movmemsi pattern is not used at all.