This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Workaround glibc <= 2.23 nextafterl/nexttowardl bug (PR tree-optimization/85699)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 10 May 2018 07:53:15 +0200
- Subject: Re: [PATCH] Workaround glibc <= 2.23 nextafterl/nexttowardl bug (PR tree-optimization/85699)
- References: <20180509205205.GZ8577@tucnak>
On May 9, 2018 10:52:05 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>glibc <= 2.23 has buggy nextafterl/nexttowardl as can be seen on the
>nextafter-2.c testcase.
>
>Do we want to workaround this bug, e.g. with the following patch?
Works for me. Was the reason to test the target libc to test the compare against arithmetic?
Thanks,
Richard.
>Regtested on x86_64-linux (with glibc 2.26). Ok for trunk?
>
>2018-05-09 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/85699
> * gcc.dg/nextafter-1.c (NO_LONG_DOUBLE): Define if not defined. Use
> !NO_LONG_DOUBLE instead of __LDBL_MANT_DIG__ != 106.
> * gcc.dg/nextafter-2.c: Include stdlib.h. For glibc < 2.24 define
> NO_LONG_DOUBLE to 1 before including nextafter-1.c.
>
>--- gcc/testsuite/gcc.dg/nextafter-1.c.jj 2018-05-06 23:12:48.952619545
>+0200
>+++ gcc/testsuite/gcc.dg/nextafter-1.c 2018-05-09 14:58:53.694198614
>+0200
>@@ -20,6 +20,9 @@ long double nexttowardl (long double, lo
> #ifndef NEED_EXC
> #define NEED_EXC 0
> #endif
>+#ifndef NO_LONG_DOUBLE
>+#define NO_LONG_DOUBLE (__LDBL_MANT_DIG__ == 106)
>+#endif
>
> #define TEST(name, fn, type, L1, L2, l1, l2, MIN1, \
> MAX1, DENORM_MIN1, EPSILON1, MIN2, MAX2, DENORM_MIN2) \
>@@ -129,7 +132,7 @@ TEST (test1, nextafterf, float, F, F, f,
> TEST (test2, nextafter, double, , , , , __DBL_MIN__, __DBL_MAX__,
> __DBL_DENORM_MIN__, __DBL_EPSILON__, __DBL_MIN__, __DBL_MAX__,
> __DBL_DENORM_MIN__)
>-#if __LDBL_MANT_DIG__ != 106
>+#if !NO_LONG_DOUBLE
>TEST (test3, nextafterl, long double, L, L, l, l, __LDBL_MIN__,
>__LDBL_MAX__,
> __LDBL_DENORM_MIN__, __LDBL_EPSILON__, __LDBL_MIN__, __LDBL_MAX__,
> __LDBL_DENORM_MIN__)
>@@ -149,7 +152,7 @@ main ()
> {
> test1 ();
> test2 ();
>-#if __LDBL_MANT_DIG__ != 106
>+#if !NO_LONG_DOUBLE
> test3 ();
> test4 ();
> test5 ();
>--- gcc/testsuite/gcc.dg/nextafter-2.c.jj 2018-05-08 13:56:38.265930160
>+0200
>+++ gcc/testsuite/gcc.dg/nextafter-2.c 2018-05-09 14:59:45.527245803
>+0200
>@@ -5,4 +5,13 @@
> /* { dg-add-options ieee } */
> /* { dg-add-options c99_runtime } */
>
>+#include <stdlib.h>
>+
>+#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
>+# if !__GLIBC_PREREQ (2, 24)
>+/* Workaround buggy nextafterl in glibc 2.23 and earlier,
>+ see https://sourceware.org/bugzilla/show_bug.cgi?id=20205 */
>+# define NO_LONG_DOUBLE 1
>+# endif
>+#endif
> #include "nextafter-1.c"
>
> Jakub