aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2013-04-25 15:51:57 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2013-04-25 15:51:57 +0000
commitea28bb0b9da3f70832bb599b298f2ae019b83a15 (patch)
treee3d276f447b6fd69f6286da14e514a8a6e73b76f
parent96659611d2076dbae333a6a85ca55da7b0a32298 (diff)
downloadgcc-ea28bb0b9da3f70832bb599b298f2ae019b83a15.zip
gcc-ea28bb0b9da3f70832bb599b298f2ae019b83a15.tar.gz
gcc-ea28bb0b9da3f70832bb599b298f2ae019b83a15.tar.bz2
re PR tree-optimization/57066 (std::logb(-inf) returns wrong value)
PR tree-optimization/57066 * builtins.c (fold_builtin_logb): Return +Inf for -Inf. * gcc.dg/torture/builtin-logb-1.c: Adjust testcase. From-SVN: r198308
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/builtins.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/builtin-logb-1.c32
4 files changed, 36 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ad47f59..41a11e3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-04-25 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/57066
+ * builtins.c (fold_builtin_logb): Return +Inf for -Inf.
+
2013-04-25 James Greenhalgh <jame.greenhalgh@arm.com>
* config/aarch64/aarch64-simd.md (neg<mode>2): Use VDQ iterator.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index efab82e..1fbd2f3 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -9698,7 +9698,16 @@ fold_builtin_logb (location_t loc, tree arg, tree rettype)
case rvc_inf:
/* If arg is Inf or NaN and we're logb, return it. */
if (TREE_CODE (rettype) == REAL_TYPE)
- return fold_convert_loc (loc, rettype, arg);
+ {
+ /* For logb(-Inf) we have to return +Inf. */
+ if (real_isinf (value) && real_isneg (value))
+ {
+ REAL_VALUE_TYPE tem;
+ real_inf (&tem);
+ return build_real (rettype, tem);
+ }
+ return fold_convert_loc (loc, rettype, arg);
+ }
/* Fall through... */
case rvc_zero:
/* Zero may set errno and/or raise an exception for logb, also
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 32d986a..bcfc726 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-04-25 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/57066
+ * gcc.dg/torture/builtin-logb-1.c: Adjust testcase.
+
2013-04-25 James Greenhalgh <james.greenhalgh@arm.com>
Tejas Belagod <tejas.belagod@arm.com>
diff --git a/gcc/testsuite/gcc.dg/torture/builtin-logb-1.c b/gcc/testsuite/gcc.dg/torture/builtin-logb-1.c
index 387ed2f..d759d1c 100644
--- a/gcc/testsuite/gcc.dg/torture/builtin-logb-1.c
+++ b/gcc/testsuite/gcc.dg/torture/builtin-logb-1.c
@@ -48,25 +48,25 @@ extern void link_error(int);
/* Test if FUNCRES(FUNC(NEG FUNCARG(ARGARG))) is false. Check the
sign as well. */
#ifndef __SPU__
-#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES) do { \
+#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES,NEG2) do { \
if (!__builtin_##FUNCRES##f(__builtin_##FUNC(NEG __builtin_##FUNCARG##f(ARGARG))) \
- || CKSGN_F(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG)), NEG __builtin_##FUNCARG##f(ARGARG))) \
+ || CKSGN_F(__builtin_##FUNC##f(NEG __builtin_##FUNCARG##f(ARGARG)), NEG2 __builtin_##FUNCARG##f(ARGARG))) \
link_error(__LINE__); \
if (!__builtin_##FUNCRES(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG))) \
- || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG __builtin_##FUNCARG(ARGARG))) \
+ || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG2 __builtin_##FUNCARG(ARGARG))) \
link_error(__LINE__); \
if (!__builtin_##FUNCRES##l(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG))) \
- || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG __builtin_##FUNCARG##l(ARGARG))) \
+ || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG2 __builtin_##FUNCARG##l(ARGARG))) \
link_error(__LINE__); \
} while (0)
#else
-#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES) do { \
+#define TESTIT3(FUNC,NEG,FUNCARG,ARGARG,FUNCRES,NEG2) do { \
/* SPU single-precision floating point format does not support Inf or Nan. */ \
if (!__builtin_##FUNCRES(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG))) \
- || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG __builtin_##FUNCARG(ARGARG))) \
+ || CKSGN(__builtin_##FUNC(NEG __builtin_##FUNCARG(ARGARG)), NEG2 __builtin_##FUNCARG(ARGARG))) \
link_error(__LINE__); \
if (!__builtin_##FUNCRES##l(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG))) \
- || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG __builtin_##FUNCARG##l(ARGARG))) \
+ || CKSGN_L(__builtin_##FUNC##l(NEG __builtin_##FUNCARG##l(ARGARG)), NEG2 __builtin_##FUNCARG##l(ARGARG))) \
link_error(__LINE__); \
} while (0)
#endif
@@ -173,15 +173,15 @@ foo(void)
/* Test for f(+-Inf) -> +-Inf and f(+-NaN) -> +-NaN, regardless of
the radix. */
- TESTIT3 (logb, ,inf, , isinf);
- TESTIT3 (logb, - ,inf, , isinf);
- TESTIT3 (logb, ,nan, "", isnan);
- TESTIT3 (logb, - ,nan, "", isnan);
-
- TESTIT3 (significand, ,inf, , isinf);
- TESTIT3 (significand, - ,inf, , isinf);
- TESTIT3 (significand, ,nan, "", isnan);
- TESTIT3 (significand, - ,nan, "", isnan);
+ TESTIT3 (logb, ,inf, , isinf, );
+ TESTIT3 (logb, - ,inf, , isinf, );
+ TESTIT3 (logb, ,nan, "", isnan, );
+ TESTIT3 (logb, - ,nan, "", isnan, -);
+
+ TESTIT3 (significand, ,inf, , isinf, );
+ TESTIT3 (significand, - ,inf, , isinf, -);
+ TESTIT3 (significand, ,nan, "", isnan, );
+ TESTIT3 (significand, - ,nan, "", isnan, -);
}
int main()