blob: aa71dcac6588be175a86ccfc745b0be51ada901f [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O2" } */
/* This maps to essentially the same gimple that is generated for
gnat.dg/sin_cos.adb, on platforms that use the wraplf variant of
Ada.Numerics.Aux_Float. The value of EPSILON is not relevant to
the test, but the test must be there to keep the conversions in
different BBs long enough to trigger the problem that prevented the
sincos optimization, because the arguments passed to sin and cos
didn't get unified into a single SSA_NAME in time for sincos. */
#include <math.h>
#define EPSILON 3.4526697709225118160247802734375e-4
static float my_sinf(float x) {
return (float) sin ((double) x);
}
static float wrap_sinf(float x) {
if (fabs (x) < EPSILON)
return 0;
return my_sinf (x);
}
static float my_cosf(float x) {
return (float) cos ((double) x);
}
static float wrap_cosf(float x) {
if (fabs (x) < EPSILON)
return 1;
return my_cosf (x);
}
float my_sin_cos(float x, float *s, float *c) {
*s = wrap_sinf (x);
*c = wrap_cosf (x);
}
/* { dg-final { scan-assembler "sincos\|cexp" { target *-linux-gnu* *-w64-mingw* *-*-vxworks* } } } */