catrig[fl].c and inexact

Steve Kargl sgk at troutmask.apl.washington.edu
Fri May 12 21:56:58 UTC 2017


So, I've been making improvements to my implementations of
the half-cycle trig functions.  In doing so, I decide to 
add WARNS=2 to msun/Makefile.  clang 4.0.0 dies with an
error about an unused variable in raise_inexact() from 
catrig[fl].c.

/usr/home/kargl/trunk/math/libm/msun/src/catrigl.c:195:2: error: unused variable
      'junk' [-Werror,-Wunused-variable]
        raise_inexact();
        ^
/usr/home/kargl/trunk/math/libm/msun/src/catrigl.c:56:45: note: expanded from
      macro 'raise_inexact'
#define raise_inexact() do { volatile float junk = 1 + tiny; } while(0)
                                            ^
Grepping catrig.o for the variable 'junk' suggests that 'junk' is
optimized out (with at least -O2).

A quick and dirty patch to achieve the intent of the original
code follows.  It would be nice if some would like to commit
the patch.  Of course, you may want to wait for Bruce to 
review the diff.


Index: src/catrig.c
===================================================================
--- src/catrig.c	(revision 1935)
+++ src/catrig.c	(working copy)
@@ -37,7 +37,7 @@ __FBSDID("$FreeBSD: head/lib/msun/src/catrig.c 313863 
 #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(x)	do { (x) = 1 + tiny; } while(0)
 #undef signbit
 #define signbit(x)	(__builtin_signbit(x))
 
@@ -315,7 +315,7 @@ casinh(double complex z)
 		return (z);
 
 	/* All remaining cases are inexact. */
-	raise_inexact();
+	raise_inexact(new_y);
 
 	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
 		return (z);
@@ -400,7 +400,7 @@ cacos(double complex z)
 		return (CMPLX(0, -y));
 
 	/* All remaining cases are inexact. */
-	raise_inexact();
+	raise_inexact(new_x);
 
 	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
 		return (CMPLX(pio2_hi - (x - pio2_lo), -y));
@@ -607,7 +607,7 @@ catanh(double complex z)
 		 * inexact, but this is the only only that needs to do it
 		 * explicitly.
 		 */
-		raise_inexact();
+		raise_inexact(ax);
 		return (z);
 	}
 
Index: src/catrigf.c
===================================================================
--- src/catrigf.c	(revision 1935)
+++ src/catrigf.c	(working copy)
@@ -51,7 +51,7 @@ __FBSDID("$FreeBSD: head/lib/msun/src/catrigf.c 275819
 #define isinf(x)	(fabsf(x) == INFINITY)
 #undef isnan
 #define isnan(x)	((x) != (x))
-#define	raise_inexact()	do { volatile float junk = 1 + tiny; } while(0)
+#define	raise_inexact(x)	do { (x) = 1 + tiny; } while(0)
 #undef signbit
 #define signbit(x)	(__builtin_signbitf(x))
 
@@ -176,7 +176,7 @@ casinhf(float complex z)
 	if (x == 0 && y == 0)
 		return (z);
 
-	raise_inexact();
+	raise_inexact(new_y);
 
 	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
 		return (z);
@@ -234,7 +234,7 @@ cacosf(float complex z)
 	if (x == 1 && y == 0)
 		return (CMPLXF(0, -y));
 
-	raise_inexact();
+	raise_inexact(new_x);
 
 	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
 		return (CMPLXF(pio2_hi - (x - pio2_lo), -y));
@@ -365,7 +365,7 @@ catanhf(float complex z)
 		    copysignf(pio2_hi + pio2_lo, y)));
 
 	if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
-		raise_inexact();
+		raise_inexact(ax);
 		return (z);
 	}
 
Index: src/catrigl.c
===================================================================
--- src/catrigl.c	(revision 1935)
+++ src/catrigl.c	(working copy)
@@ -53,7 +53,7 @@ __FBSDID("$FreeBSD: head/lib/msun/src/catrigl.c 313761
 #define isinf(x)	(fabsl(x) == INFINITY)
 #undef isnan
 #define isnan(x)	((x) != (x))
-#define	raise_inexact()	do { volatile float junk = 1 + tiny; } while(0)
+#define	raise_inexact(x)	do { (x) = 1 + tiny; } while(0)
 #undef signbit
 #define signbit(x)	(__builtin_signbitl(x))
 
@@ -192,7 +192,7 @@ casinhl(long double complex z)
 	if (x == 0 && y == 0)
 		return (z);
 
-	raise_inexact();
+	raise_inexact(new_y);
 
 	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
 		return (z);
@@ -251,7 +251,7 @@ cacosl(long double complex z)
 	if (x == 1 && y == 0)
 		return (CMPLXL(0, -y));
 
-	raise_inexact();
+	raise_inexact(new_x);
 
 	if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
 		return (CMPLXL(pio2_hi - (x - pio2_lo), -y));
@@ -383,7 +383,7 @@ catanhl(long double complex z)
 		    copysignl(pio2_hi + pio2_lo, y)));
 
 	if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
-		raise_inexact();
+		raise_inexact(ax);
 		return (z);
 	}
 

-- 
Steve
20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4
20161221 https://www.youtube.com/watch?v=IbCHE-hONow


More information about the freebsd-numerics mailing list