https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101612

            Bug ID: 101612
           Summary: _Complex float multiply expansion does not allow for a
                    tail call to __mulsc3
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Take:
_Complex float f(_Complex float x, _Complex float y) {
  return x*y;
}
----- CUT -----
At -O2, we produce during complex lowering:
  if (_13 unord _14)
    goto <bb 4>; [0.05%]
  else
    goto <bb 3>; [99.95%]

  <bb 4> [local count: 536864]:
  _15 = __mulsc3 (x$real_5, x$imag_6, y$real_7, y$imag_8);
  _16 = REALPART_EXPR <_15>;
  _17 = IMAGPART_EXPR <_15>;
  GIMPLE_NOP

  <bb 3> [local count: 1073741824]:
  # _18 = PHI <_13(2), _16(4)>
  # _19 = PHI <_14(2), _17(4)>
  _3 = COMPLEX_EXPR <_18, _19>;

This does allow __mulsc3 to be tailed call as the tail call coding does not
know anything about COMPLEX_EXPR and REAL/IMAGPART_EXPR.

Reply via email to