https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105463
Bug ID: 105463 Summary: [12/13 Regression] MVE: Wrong code, incorrect alignment assumption Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: acoplan at gcc dot gnu.org Target Milestone: --- The following code is reduced from gcc.c-torture/execute/pr65369.c: void foo (unsigned *); void bar (const unsigned char *block) { unsigned buf[4]; __builtin_memcpy (buf + 0, block + 0, 4); __builtin_memcpy (buf + 1, block + 4, 4); __builtin_memcpy (buf + 2, block + 8, 4); __builtin_memcpy (buf + 3, block + 12, 4); foo (buf); } and it is miscompiled, starting in GCC 12, for MVE (with -march=armv8.1-m.main+mve -O2). We generate: bar: mov r3, r0 push {lr} sub sp, sp, #20 mov r0, sp vldrw.32 q3, [r3] vstrw.32 q3, [r0] bl foo add sp, sp, #20 ldr pc, [sp], #4 where vldrw.32 requires a 4-byte aligned address, but the source of course has no such requirement: memcpy does not require an aligned address.