Re: Optimization bug with floating-point?

From: Steve Kargl <sgk_at_troutmask.apl.washington.edu>
Date: Wed, 13 Mar 2019 08:50:09 -0700
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
Received on Wed Mar 13 2019 - 14:50:13 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:20 UTC