https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89125
--- Comment #1 from kargl at gcc dot gnu.org ---
Fortran code used in harmonic analysis often contains lines
of form
p = cmplx(cos(x),sin(x)) ! compute exp(i*x) for real x
On platforms with a sincos(x, &s, &c) routine the above should
be transformed to
call sincos(x, &s, &c)
p = cmplx(c, s)
The reason is that both sin() and cos() perform argument reduction
of x into the range [0,pi/4]. sincos() performs this reduce once,
and hence is typically faster. The same optimization should apply
to C/C++ code.
#include <math.h>
double
foo(double x)
{
double c,s,res;
c = cos(x);
s = sin(x);
res = c * s;
return res;
}
% ~/work/x/bin/gcc -o - -S -O3 -o a.s a.c
.file "a.c"
.text
.p2align 4
.globl foo
.type foo, @function
foo:
.LFB3:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
movsd %xmm0, 8(%rsp)
call cos
movsd 8(%rsp), %xmm1
movsd %xmm0, (%rsp)
movapd %xmm1, %xmm0
call sin
mulsd (%rsp), %xmm0
addq $24, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE3:
.size foo, .-foo
.ident "GCC: (GNU) 9.0.1 20190125 (experimental)"
.section .note.GNU-stack,"",@progbits