https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104405
Bug ID: 104405 Summary: Inefficient register allocation on complex arithmetic Product: gcc Version: 12.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: tnfchris at gcc dot gnu.org Target Milestone: --- The following testcase #include <complex.h> complex double f (complex double a, complex double b) { return a * b * I; } compiled at -Ofast has unneeded copies of input i.e. f: fmov d4, d1 fmov d1, d0 fmul d0, d4, d2 fmul d4, d4, d3 fnmadd d0, d1, d3, d0 fnmsub d1, d1, d2, d4 ret the first two moves are unneeded and looks to be an artifact of how IMAGPART_EXPR and REALPART_EXPR are expanded. This seems to be a generic issue as both x86 and Arm targets seem to have the same problem.