https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113550
Bug ID: 113550 Summary: data512_t initializers dereference a clobbered register Product: gcc Version: 12.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: ianthompson at microsoft dot com Target Milestone: --- Target: aarch64 Created attachment 57189 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57189&action=edit Additional non-minimal failing cases When initializing or copying a data512_t, the compiler is generating code which clobbers the register containing the source pointer of the copy. Initially observed on Arm GNU Toolchain 12.2.Rel1, but this also reproduces on trunk. Minimal reproduction, hits a segfault when compiled with "aarch64-none-elf-gcc -march=armv9-a+ls64": #include <arm_acle.h> void test_data512_init() { data512_t my_value = {}; } This code generates this assembly snippet for initializing my_value: adrp x0, .LC0 add x0, x0, :lo12:.LC0 ldp x0, x1, [x0] ldp x2, x3, [x0, 16] ldp x4, x5, [x0, 32] ldp x6, x7, [x0, 48] Notice that the first ldp clobbers x0, redirecting the remaining 3 loads to whatever address happens to be in val[0] of the initializer. Similar incorrect code is generated in many other situations that involve copying a data512_t (passing a global variable to a function, dereferencing a data512_t*, etc). See the attached source file for the other failing cases I'm seeing.