https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97161
Bug ID: 97161 Summary: [8/9/10/11 Regression] aarch64: Wrong code at -O2/-O3 since r8-4308-g13494fcb3 Product: gcc Version: 11.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: --- For the following C program: __attribute__ ((noinline)) void f(char *p, char x) { if (x != 1) __builtin_abort(); } union { char a; int b; short c; } d; short g, *e = &d.c; int i; int main() { int *h = &d.b; g = *h = 1; *e |= i; f(0, d.a); } GCC generates wrong code (and abort is called) at -O2 on AArch64 after r8-4308-g13494fcb363e8a901db7768a851a9eed1dea62e3. The issue goes away with -fno-strict-aliasing, but I believe this program does not violate the strict aliasing constraints: we're simply accessing each member of the union by its given type. GCC trunk (x86) and clang 10 (x86 and aarch64) at -O{0,1,2,3} all produce a program that exits cleanly. To reproduce, on AArch64: $ gcc test.c $ ./a.out $ gcc test.c -O2 $ ./a.out Aborted (core dumped)