Date: Sun, 14 May 2017 05:14:53 +1000 (EST) From: Bruce Evans <brde@optusnet.com.au> To: Dimitry Andric <dimitry@andric.com> Cc: sgk@troutmask.apl.washington.edu, freebsd-hackers@freebsd.org, numerics@freebsd.org Subject: Re: catrig[fl].c and inexact Message-ID: <20170514043645.G2059@besplex.bde.org> In-Reply-To: <FB138623-DF5B-4DBD-94FE-29E21FF7FDC6@andric.com> References: <20170512215654.GA82545@troutmask.apl.washington.edu> <20170513103208.M845@besplex.bde.org> <20170513060803.GA84399@troutmask.apl.washington.edu> <F5F8736B-D7E1-48AD-BC6C-8C74AF0A3272@andric.com> <20170513162153.GB88653@troutmask.apl.washington.edu> <FB138623-DF5B-4DBD-94FE-29E21FF7FDC6@andric.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 13 May 2017, Dimitry Andric wrote: > On 13 May 2017, at 18:21, Steve Kargl <sgk@troutmask.apl.washington.edu> wrote: >> >> On Sat, May 13, 2017 at 03:08:26PM +0200, Dimitry Andric wrote: > ... >> >>> Using the full catrig.c and -O3, I tried gcc 4.2.1, 4.7.4, 4.8.5, 4.9.4, >>> 5.4.0, 6.3.0 and 7.0.1, in addition to clang 3.4.1, 3.8.0, 3.9.1, 4.0.0 >>> and 5.0.0. >> >> Thanks for checking. I reduced catrig.c to a small self-contained >> program and indeed I was getting the desired addition of 1 + tiny >> to raise FE_INEXACT. I suppose that I'll need to add an appropriate >> -Wno-foo to my CFLAGS line to suppress the spurious warning, which >> might be tricky because -Wunused is one option I'ld like to have. > > The following also gets rid of the warnings: > > Index: lib/msun/src/catrig.c > =================================================================== > --- lib/msun/src/catrig.c (revision 318032) > +++ lib/msun/src/catrig.c (working copy) > @@ -37,7 +37,7 @@ > #define isinf(x) (fabs(x) == INFINITY) > #undef isnan > #define isnan(x) ((x) != (x)) > -#define raise_inexact() do { volatile float junk = 1 + tiny; } while(0) > +#define raise_inexact() do { volatile float junk __unused = 1 + tiny; } while(0) > #undef signbit > #define signbit(x) (__builtin_signbit(x)) > ... > > If you are OK with that, I will commit it later today. It is what I said was best yeseterday :-). Except, __unused is an obfuscation meaning __used. I couldn't get __used to work today either. It works with static variables, but for auto variables it generates "'__used__' attribute ignored" for both clang-3.9.0 and gcc-4.2.1, even without any -W flags to ask for excessive warnings. Today I looked at the macro used(expr), which would be used like used(1 + tiny) for inexact, used(huge * huge) for overflow, and used(tiny * tiny) for underflow. The difficulty is to declare the variable to hold the result, especially since we don't want this variable to be in memory. Also in some cases, we would like to return the result. For overflow, we can do either: ({ volatile float junk __unused = huge * huge; INFINITY; }) or ({ __typeof(huge) r; STRICT_ASSIGN(..., huge * huge); r; }) with different tradoffs (the second is broken if r is not used and there is no volatile hidden in STRICT_ASSIGN()), or better, only load huge once (float t = huge; junk = t * t;). Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170514043645.G2059>