Optimization bug with floating-point?
Steve Kargl
sgk at troutmask.apl.washington.edu
Wed Mar 13 15:50:13 UTC 2019
On Wed, Mar 13, 2019 at 04:41:51PM +0100, Hans Petter Selasky wrote:
> On 3/13/19 4:16 PM, Steve Kargl wrote:
> > On Tue, Mar 12, 2019 at 07:45:41PM -0700, Steve Kargl wrote:
> >>
> >> gcc8 --version
> >> gcc8 (FreeBSD Ports Collection) 8.3.0
> >>
> >> gcc8 -fno-builtin -o z a.c -lm && ./z
> >> gcc8 -O -fno-builtin -o z a.c -lm && ./z
> >> gcc8 -O2 -fno-builtin -o z a.c -lm && ./z
> >> gcc8 -O3 -fno-builtin -o z a.c -lm && ./z
> >>
> >> Max ULP: 2.297073
> >> Count: 0 (# of ULP that exceed 21)
> >>
> >
> > clang agrees with gcc8 if one changes ...
> >
> >> int
> >> main(void)
> >> {
> >> double re, im, u, ur, ui;
> >> float complex f;
> >> float x, y;
> >
> > this line to "volatile float x, y".
> >
>
> Can you try to use:
>
> #define sincos(x,p,q) do { \
> *(p) = sin(x); \
> *(q) = cos(x); \
> } while (0)
>
>
> Instead of libm's sincos(). Might be a bug in there.
>
Using sin() and cos() directly as in
/* Double precision csinh() without using C's double complex.s */
void
dp_csinh(double x, double y, double *re, double *im)
{
double c, s;
*re = sinh(x) * cos(y);
*im = cosh(x) * sin(y);
}
does not change the result. I'll also note that libm
is compiled by clang, and I do not recompile it for the
tests. Both gcc8 and cc are using the same libm.
I've also tested clang of amd64 with the -m32, it fails
as well.
--
Steve
More information about the freebsd-current
mailing list