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.

Reply via email to