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/