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.

Reply via email to