https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50417
npl at chello dot at changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |npl at chello dot at
--- Comment #7 from npl at chello dot at ---
This seems to affect even the most trivial cases. I ran the following code witn
arm gcc 4.8.4, 4.9.2 and 5.3.0:
#include <stdint.h>
#include <string.h>
uint32_t foo_noalign(const uint32_t *s) {
uint32_t v;
memcpy(&v, s, sizeof(v));
return v;
}
uint32_t foo(const uint32_t *s) {
uint32_t v;
memcpy(&v, __builtin_assume_aligned(s, 4), sizeof(v));
return v;
}
Which generates the following code:
00000000 <foo_noalign>:
0: e92d4007 push {r0, r1, r2, lr}
4: e3a02004 mov r2, #4
8: e1a01000 mov r1, r0
c: e08d0002 add r0, sp, r2
10: ebfffffe bl 0 <memcpy>
14: e59d0004 ldr r0, [sp, #4]
18: e28dd00c add sp, sp, #12
1c: e49de004 pop {lr} ; (ldr lr, [sp], #4)
20: e12fff1e bx lr
00000024 <foo>:
24: e5900000 ldr r0, [r0]
28: e12fff1e bx lr
Thats really, really bad. clang has no problems generating the optimal code.