https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100363
Alexander Monakov <amonakov at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amonakov at gcc dot gnu.org --- Comment #7 from Alexander Monakov <amonakov at gcc dot gnu.org> --- The github issue has a more relevant code quote: #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS <-- this is enabled for ARCv2 279: PUP(sout) = PUP(sfrom); #else PUP(sout) = UP_UNALIGNED(sfrom); #endif Most likely the issue is that sout/sfrom are misaligned at runtime, while the vectorized code somewhere relies on them being sufficiently aligned for a 'short'. It is unsafe to dereference a misaligned pointer. The pointed-to-type must have reduced alignment: typedef unsigned short u16_u __attribute__((aligned(1))); u16_u *sout = ... u16_u *sfrom = (void *)(from - OFF); (without -ffreestanding, memcpy/memmove is a portable way to express a misaligned access) https://trust-in-soft.com/blog/2020/04/06/gcc-always-assumes-aligned-pointer-accesses/