re PR tree-optimization/84235 (Miscompilation of floating point code by dom2)
authorJakub Jelinek <jakub@redhat.com>
Wed, 7 Feb 2018 08:29:58 +0000 (09:29 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 7 Feb 2018 08:29:58 +0000 (09:29 +0100)
PR tree-optimization/84235
* tree-ssa-scopedtables.c
(avail_exprs_stack::simplify_binary_operation): Fir MINUS_EXPR, punt
if the subtraction is performed in floating point type where NaNs are
honored.  For *DIV_EXPR, punt for ALL_FRACT_MODE_Ps where we can't
build 1.  Formatting fix.

* gcc.c-torture/execute/ieee/pr84235.c: New test.

From-SVN: r257437

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/ieee/pr84235.c [new file with mode: 0644]
gcc/tree-ssa-scopedtables.c

index 8edc8cc84a1bd5ea90853e30d487d39b90caa441..088aa47757457b4f91ca395d8203faa3175b2583 100644 (file)
@@ -1,3 +1,12 @@
+2018-02-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/84235
+       * tree-ssa-scopedtables.c
+       (avail_exprs_stack::simplify_binary_operation): Fir MINUS_EXPR, punt
+       if the subtraction is performed in floating point type where NaNs are
+       honored.  For *DIV_EXPR, punt for ALL_FRACT_MODE_Ps where we can't
+       build 1.  Formatting fix.
+
 2018-02-06  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/84146
index a32ef3772940f65dd61986b385e5ae3b04754fb0..ac3949a3b023a6844eff74dfa143ecc2436a9e48 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/84235
+       * gcc.c-torture/execute/ieee/pr84235.c: New test.
+
 2018-02-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR testsuite/84243
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/pr84235.c b/gcc/testsuite/gcc.c-torture/execute/ieee/pr84235.c
new file mode 100644 (file)
index 0000000..479b2b0
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR tree-optimization/84235 */
+
+int
+main ()
+{
+  double d = 1.0 / 0.0;
+  _Bool b = d == d && (d - d) != (d - d);
+  if (!b)
+    __builtin_abort ();
+  return 0;
+}
index 47cca782595ff9faa9bcd8e56a948538715551f2..2a40fdae0a27b78d84e9f989ef181bb5a89022b5 100644 (file)
@@ -182,8 +182,15 @@ avail_exprs_stack::simplify_binary_operation (gimple *stmt,
                      case BIT_AND_EXPR:
                        return gimple_assign_rhs1 (stmt);
 
-                     case BIT_XOR_EXPR:
                      case MINUS_EXPR:
+                       /* This is unsafe for certain floats even in non-IEEE
+                          formats.  In IEEE, it is unsafe because it does
+                          wrong for NaNs.  */
+                       if (FLOAT_TYPE_P (result_type)
+                           && HONOR_NANS (result_type))
+                         break;
+                       /* FALLTHRU */
+                     case BIT_XOR_EXPR:
                      case TRUNC_MOD_EXPR:
                      case CEIL_MOD_EXPR:
                      case FLOOR_MOD_EXPR:
@@ -195,6 +202,9 @@ avail_exprs_stack::simplify_binary_operation (gimple *stmt,
                      case FLOOR_DIV_EXPR:
                      case ROUND_DIV_EXPR:
                      case EXACT_DIV_EXPR:
+                       /* Avoid _Fract types where we can't build 1.  */
+                       if (ALL_FRACT_MODE_P (TYPE_MODE (result_type)))
+                         break;
                        return build_one_cst (result_type);
 
                      default:
@@ -204,8 +214,8 @@ avail_exprs_stack::simplify_binary_operation (gimple *stmt,
                break;
              }
 
-             default:
-               break;
+           default:
+             break;
            }
        }
     }