https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83661
Bug ID: 83661
Summary: sincos does not handle sin(2x)
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: prathamesh3492 at gcc dot gnu.org
Target Milestone: ---
Hi,
For the following test-case:
double f(double x)
{
return __builtin_sin(2*x) + __builtin_sin(x);
}
optimzied dump with -O2 -funsafe-math-optimizations -ffast-math shows:
;; Function f (f, funcdef_no=0, decl_uid=1952, cgraph_uid=0, symbol_order=0)
<bb 2> [local count: 1073741825]:
_1 = __builtin_sin (x_4(D));
_2 = x_4(D) * 2.0e+0;
_3 = __builtin_sin (_2);
_5 = _1 + _3;
return _5;
Would it be a good idea to enhance sincos pass to recognize the
identity sin(2*x) = 2*sin(x)*cos(x) and thus eliminate one call
to __builtin_sin ?
Writing 2*sin(x)*cos(x) explicitly in the source yields following optimized
dump:
<bb 2> [local count: 1073741825]:
sincostmp_8 = __builtin_cexpi (x_5(D));
_1 = IMAGPART_EXPR <sincostmp_8>;
_2 = REALPART_EXPR <sincostmp_8>;
_3 = _1 * _2;
_4 = _3 * 2.0e+0;
_6 = _2 + _4;
return _6;
I agree in general that adding math identities like sin(x)**2 + cos(x)**2 = 1
isn't a good idea since user would almost always write the "optimized" version
in practice. However for the above case, would the transform make sense ?
Thanks,
Prathamesh