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
+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
+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
--- /dev/null
+/* 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;
+}
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:
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:
break;
}
- default:
- break;
+ default:
+ break;
}
}
}