https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95526
Bug ID: 95526 Summary: aarch64: Wrong code accessing complex number from varargs Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: major Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: acoplan at gcc dot gnu.org Target Milestone: --- Commit eb72dc663e9070b281be83a80f6f838a3a878822 introduces a wrong code bug on AArch64. This causes the test case gcc/testsuite/gcc.dg/complex-1.c to start failing. This test case can be reduced to the following program: extern void abort(void); void f(unsigned x, ...) { __builtin_va_list ap; _Complex float cf; __builtin_va_start(ap, x); cf = __builtin_va_arg(ap, _Complex float); __builtin_va_end(ap); if (__imag__ cf != 2.0f) abort(); } int main(void) { f(0, 2.0fi); } which calls abort() at both -O0 and -O2 after this patch. Prior to this patch, we get the following code for f at -O2: f: .LFB0: .cfi_startproc stp x29, x30, [sp, -80]! .cfi_def_cfa_offset 80 .cfi_offset 29, -80 .cfi_offset 30, -72 mov x29, sp str q1, [sp, 64] fmov s1, 2.0e+0 add x0, sp, 80 ldr s2, [sp, 64] stp x0, x0, [sp, 16] fcmp s2, s1 str x0, [sp, 32] stp wzr, wzr, [sp, 40] str q0, [sp, 48] bne .L8 ldp x29, x30, [sp], 80 .cfi_remember_state .cfi_restore 30 .cfi_restore 29 .cfi_def_cfa_offset 0 ret .L8: .cfi_restore_state bl abort .cfi_endproc and now, we get: f: .LFB0: .cfi_startproc stp x29, x30, [sp, -80]! .cfi_def_cfa_offset 80 .cfi_offset 29, -80 .cfi_offset 30, -72 mov w0, -32 add x1, sp, 80 mov x29, sp stp x1, x1, [sp, 16] str x1, [sp, 32] stp wzr, w0, [sp, 40] str q0, [sp, 48] str q1, [sp, 64] bl abort .cfi_endproc which appears to unconditionally call abort().