aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-07-09 12:56:47 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-07-09 12:56:47 +0200
commit56d04c75ef9df0e2c052c280cb8926e493edda6c (patch)
treeff2174ae67899267575fd8fd6deb26d63dd44cdd /gcc
parenteccba1ac5de7ca66c8201870c8b46c972c191fa0 (diff)
downloadgcc-56d04c75ef9df0e2c052c280cb8926e493edda6c.zip
gcc-56d04c75ef9df0e2c052c280cb8926e493edda6c.tar.gz
gcc-56d04c75ef9df0e2c052c280cb8926e493edda6c.tar.bz2
re PR c/86420 (nextafter(0x1p-1022,0) is constant folded)
PR c/86420 * real.c (real_nextafter): Return true if result is denormal. * gcc.dg/nextafter-1.c (TEST): Adjust the tests that expect denormals to be returned and when first argument is not 0, so that they don't do anything for NEED_EXC or NEED_ERRNO. From-SVN: r262517
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/real.c2
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/nextafter-1.c52
4 files changed, 52 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 575dff4..e4ecd4c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/86420
+ * real.c (real_nextafter): Return true if result is denormal.
+
2018-07-09 Martin Liska <mliska@suse.cz>
* common.opt: Add back wrongly removed attribute.
diff --git a/gcc/real.c b/gcc/real.c
index eefa69e..f822ae8 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -5141,7 +5141,7 @@ real_nextafter (REAL_VALUE_TYPE *r, format_helper fmt,
get_zero (r, x->sign);
return true;
}
- return r->cl == rvc_zero;
+ return r->cl == rvc_zero || REAL_EXP (r) < fmt->emin;
}
/* Write into BUF the maximum representable finite floating-point
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 43b8182..6b51bc6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2018-07-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/86420
+ * gcc.dg/nextafter-1.c (TEST): Adjust the tests that expect denormals
+ to be returned and when first argument is not 0, so that they don't do
+ anything for NEED_EXC or NEED_ERRNO.
+
2018-07-09 Tom de Vries <tdevries@suse.de>
* gcc.dg/guality/asm-1.c: Use relative line numbers where obvious.
diff --git a/gcc/testsuite/gcc.dg/nextafter-1.c b/gcc/testsuite/gcc.dg/nextafter-1.c
index a768574..502e0f4 100644
--- a/gcc/testsuite/gcc.dg/nextafter-1.c
+++ b/gcc/testsuite/gcc.dg/nextafter-1.c
@@ -58,23 +58,41 @@ name (void) \
= (NEED_EXC || NEED_ERRNO) ? __builtin_inf##l1 () \
: fn (MAX1, __builtin_inf ()); \
CHECK (__builtin_isinf##l1 (m) && !__builtin_signbit (m)); \
- const type n = fn (DENORM_MIN1, 12.0##L2); \
+ const type n \
+ = (NEED_EXC || NEED_ERRNO) ? 2.0##L1 * DENORM_MIN1 \
+ : fn (DENORM_MIN1, 12.0##L2); \
CHECK (n == 2.0##L1 * DENORM_MIN1); \
- const type o = fn (n, 24.0##L2); \
+ const type o \
+ = (NEED_EXC || NEED_ERRNO) ? 3.0##L1 * DENORM_MIN1 \
+ : fn (n, 24.0##L2); \
CHECK (o == 3.0##L1 * DENORM_MIN1); \
- const type p = fn (o, 132.0##L2); \
+ const type p \
+ = (NEED_EXC || NEED_ERRNO) ? 4.0##L1 * DENORM_MIN1 \
+ : fn (o, 132.0##L2); \
CHECK (p == 4.0##L1 * DENORM_MIN1); \
- const type q = fn (2.0##L1 * DENORM_MIN1, -__builtin_inf ()); \
+ const type q \
+ = (NEED_EXC || NEED_ERRNO) ? DENORM_MIN1 \
+ : fn (2.0##L1 * DENORM_MIN1, -__builtin_inf ()); \
CHECK (q == DENORM_MIN1); \
- const type r = fn (3.0##L1 * DENORM_MIN1, DENORM_MIN2); \
+ const type r \
+ = (NEED_EXC || NEED_ERRNO) ? 2.0##L1 * DENORM_MIN1 \
+ : fn (3.0##L1 * DENORM_MIN1, DENORM_MIN2); \
CHECK (r == 2.0##L1 * DENORM_MIN1); \
- const type s = fn (4.0##L1 * DENORM_MIN1, 2.0##L2 * DENORM_MIN2); \
+ const type s \
+ = (NEED_EXC || NEED_ERRNO) ? 3.0##L1 * DENORM_MIN1 \
+ : fn (4.0##L1 * DENORM_MIN1, 2.0##L2 * DENORM_MIN2); \
CHECK (s == 3.0##L1 * DENORM_MIN1); \
- const type t = fn (MIN1, 0.0##L2); \
+ const type t \
+ = (NEED_EXC || NEED_ERRNO) ? MIN1 - DENORM_MIN1 \
+ : fn (MIN1, 0.0##L2); \
CHECK (t == MIN1 - DENORM_MIN1); \
- const type u = fn (MIN1 - DENORM_MIN1, -MIN2); \
+ const type u \
+ = (NEED_EXC || NEED_ERRNO) ? MIN1 - 2.0##L1 * DENORM_MIN1 \
+ : fn (MIN1 - DENORM_MIN1, -MIN2); \
CHECK (u == MIN1 - 2.0##L1 * DENORM_MIN1); \
- const type v = fn (MIN1 - 2.0##L1 * DENORM_MIN1, 100.0##L2); \
+ const type v \
+ = (NEED_EXC || NEED_ERRNO) ? MIN1 - DENORM_MIN1 \
+ : fn (MIN1 - 2.0##L1 * DENORM_MIN1, 100.0##L2); \
CHECK (v == MIN1 - DENORM_MIN1); \
const type w = fn (MIN1 - DENORM_MIN1, MAX2); \
CHECK (w == MIN1); \
@@ -82,9 +100,13 @@ name (void) \
CHECK (x == MIN1 + DENORM_MIN1); \
const type y = fn (MIN1 + DENORM_MIN1, __builtin_inf##l2 ()); \
CHECK (y == MIN1 + 2.0##L1 * DENORM_MIN1); \
- const type z = fn (MIN1 / 2.0##L1, -MIN2); \
+ const type z \
+ = (NEED_EXC || NEED_ERRNO) ? MIN1 / 2.0##L1 - DENORM_MIN1 \
+ : fn (MIN1 / 2.0##L1, -MIN2); \
CHECK (z == MIN1 / 2.0##L1 - DENORM_MIN1); \
- const type aa = fn (-MIN1 / 4.0##L1, MIN2); \
+ const type aa \
+ = (NEED_EXC || NEED_ERRNO) ? -MIN1 / 4.0##L1 + DENORM_MIN1 \
+ : fn (-MIN1 / 4.0##L1, MIN2); \
CHECK (aa == -MIN1 / 4.0##L1 + DENORM_MIN1); \
const type ab = fn (MIN1 * 2.0##L1, -MIN2); \
CHECK (ab == MIN1 * 2.0##L1 - DENORM_MIN1); \
@@ -92,9 +114,13 @@ name (void) \
CHECK (ac == MIN1 * 4.0##L1 - DENORM_MIN1 * 2.0##L1); \
const type ad = fn (MIN1 * 64.0##L1, MIN2); \
CHECK (ad == MIN1 * 64.0##L1 - DENORM_MIN1 * 32.0##L1); \
- const type ae = fn (MIN1 / 2.0##L1 - DENORM_MIN1, 100.0##L2); \
+ const type ae \
+ = (NEED_EXC || NEED_ERRNO) ? MIN1 / 2.0##L1 \
+ : fn (MIN1 / 2.0##L1 - DENORM_MIN1, 100.0##L2); \
CHECK (ae == MIN1 / 2.0##L1); \
- const type af = fn (-MIN1 / 4 + DENORM_MIN1, -100.0##L2); \
+ const type af \
+ = (NEED_EXC || NEED_ERRNO) ? -MIN1 / 4.0##L1 \
+ : fn (-MIN1 / 4 + DENORM_MIN1, -100.0##L2); \
CHECK (af == -MIN1 / 4.0##L1); \
const type ag = fn (MIN1 * 2.0##L1 - DENORM_MIN1, 100.0##L2); \
CHECK (ag == MIN1 * 2.0##L1); \