Hello,

this patch only handles the simple case where the constant is 0, I'll keep the PR open for the more general case. Note that if we split flag_trapping_math into no|weak|strict, the test here would be !=strict, since we only remove trapping operations.

Passes bootstrap+testsuite on x86_64-linux-gnu.

2013-05-27  Marc Glisse  <marc.gli...@inria.fr>

        PR tree-optimization/57371
gcc/
        * fold-const.c (fold_comparison): Fold comparison of a FLOAT_EXPR
        with 0.

gcc/testsuite/
        * gcc.dg/pr57371-1.c: New testcase.
        * gcc.dg/pr57371-2.c: Likewise.
        * gcc.dg/pr57371-3.c: Likewise.

--
Marc Glisse
Index: fold-const.c
===================================================================
--- fold-const.c        (revision 199323)
+++ fold-const.c        (working copy)
@@ -9362,20 +9362,38 @@ fold_comparison (location_t loc, enum tr
            }
 
          /* Fold comparisons against infinity.  */
          if (REAL_VALUE_ISINF (cst)
              && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
            {
              tem = fold_inf_compare (loc, code, type, arg0, arg1);
              if (tem != NULL_TREE)
                return tem;
            }
+
+         /* (double)i CMP 0 is just i CMP 0.  See PR 57371 for how this
+            can be extended to non-zero constants.  */
+         if (TREE_CODE (arg0) == FLOAT_EXPR && real_zerop (arg1))
+           {
+             tree inner = TREE_OPERAND (arg0, 0);
+             tree itype = TREE_TYPE (inner);
+             tree ftype = TREE_TYPE (arg0);
+             /* If ftype cannot represent exactly all values of itype,
+                we may have an inexact exception.  If the conversion from
+                itype to ftype may overflow (unsigned __int128 to float),
+                we may have an overflow exception.  */
+             if (!flag_trapping_math
+                 || (unsigned) significand_size (TYPE_MODE (ftype))
+                    >= element_precision (itype) - !TYPE_UNSIGNED (itype))
+               return fold_build2_loc (loc, code, type, inner,
+                                       build_zero_cst (itype));
+           }
        }
 
       /* If this is a comparison of a real constant with a PLUS_EXPR
         or a MINUS_EXPR of a real constant, we can convert it into a
         comparison with a revised real constant as long as no overflow
         occurs when unsafe_math_optimizations are enabled.  */
       if (flag_unsafe_math_optimizations
          && TREE_CODE (arg1) == REAL_CST
          && (TREE_CODE (arg0) == PLUS_EXPR
              || TREE_CODE (arg0) == MINUS_EXPR)
Index: testsuite/gcc.dg/pr57371-3.c
===================================================================
--- testsuite/gcc.dg/pr57371-3.c        (revision 0)
+++ testsuite/gcc.dg/pr57371-3.c        (revision 0)
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized -ftrapping-math" } */
+
+int f (unsigned long long x)
+{
+  float y = x;
+  return y <= 0;
+}
+
+/* { dg-final { scan-tree-dump "float" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */

Property changes on: testsuite/gcc.dg/pr57371-3.c
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision URL
Added: svn:eol-style
   + native

Index: testsuite/gcc.dg/pr57371-1.c
===================================================================
--- testsuite/gcc.dg/pr57371-1.c        (revision 0)
+++ testsuite/gcc.dg/pr57371-1.c        (revision 0)
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized -ftrapping-math" } */
+
+int f (char x)
+{
+  long double y = x;
+  return y <= 0;
+}
+
+/* { dg-final { scan-tree-dump-not "double" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */

Property changes on: testsuite/gcc.dg/pr57371-1.c
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision URL
Added: svn:eol-style
   + native

Index: testsuite/gcc.dg/pr57371-2.c
===================================================================
--- testsuite/gcc.dg/pr57371-2.c        (revision 0)
+++ testsuite/gcc.dg/pr57371-2.c        (revision 0)
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized -fno-trapping-math" } */
+
+int f (unsigned long long x)
+{
+  float y = x;
+  return y <= 0;
+}
+
+/* { dg-final { scan-tree-dump-not "float" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */

Property changes on: testsuite/gcc.dg/pr57371-2.c
___________________________________________________________________
Added: svn:eol-style
   + native
Added: svn:keywords
   + Author Date Id Revision URL

Reply via email to