]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/57066 (std::logb(-inf) returns wrong value)
authorMarek Polacek <polacek@redhat.com>
Fri, 3 May 2013 08:59:14 +0000 (08:59 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 3 May 2013 08:59:14 +0000 (08:59 +0000)
PR tree-optimization/57066
        * builtins.c (fold_builtin_logb): Return +Inf for -Inf.

        * gcc.dg/torture/builtin-logb-1.c: Adjust testcase.

From-SVN: r198571

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/builtin-logb-1.c

index 56866314113f2868167cee949fe53a9460295eb2..4135a70e09aa6921c85490371f47c3c1e3ff67ab 100644 (file)
@@ -1,3 +1,11 @@
+2013-05-03  Marek Polacek  <polacek@redhat.com>
+
+       Backport from mainline
+       2013-04-25  Marek Polacek  <polacek@redhat.com>
+
+       PR tree-optimization/57066
+        * builtins.c (fold_builtin_logb): Return +Inf for -Inf.
+
 2013-04-30  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 7e4eed19dda9d3d77267c9f86e47fcdf3d0e652f..e8fef179f881b749aac4d9725b76e967b820c207 100644 (file)
@@ -9692,7 +9692,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
index 2dcb7426a1f0c604007fa1e3a5adff42b93dac0d..83dca575f7daa0851fe753814624efca65b9d3e8 100644 (file)
@@ -1,3 +1,11 @@
+2013-05-03  Marek Polacek  <polacek@redhat.com>
+
+       Backport from mainline
+       2013-04-25  Marek Polacek  <polacek@redhat.com>
+
+       PR tree-optimization/57066
+        * gcc.dg/torture/builtin-logb-1.c: Adjust testcase.
+
 2013-04-30  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 25d0f91064e7c3fa42a20628a72e8411c068de73..8a5265fd577d86e3819710e5052a6b2947546ab4 100644 (file)
@@ -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()