/* a CMP (-0) -> a CMP 0 */
(if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@1)))
(cmp @0 { build_real (TREE_TYPE (@1), dconst0); }))
+ /* (-0) CMP b -> 0 CMP b. */
+ (if (TREE_CODE (@0) == REAL_CST
+ && REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@0)))
+ (cmp { build_real (TREE_TYPE (@0), dconst0); } @1))
/* x != NaN is always true, other ops are always false. */
(if (REAL_VALUE_ISNAN (TREE_REAL_CST (@1))
- && ! HONOR_SNANS (@1))
+ && !tree_expr_signaling_nan_p (@1)
+ && !tree_expr_maybe_signaling_nan_p (@0))
+ { constant_boolean_node (cmp == NE_EXPR, type); })
+ /* NaN != y is always true, other ops are always false. */
+ (if (TREE_CODE (@0) == REAL_CST
+ && REAL_VALUE_ISNAN (TREE_REAL_CST (@0))
+ && !tree_expr_signaling_nan_p (@0)
+ && !tree_expr_signaling_nan_p (@1))
{ constant_boolean_node (cmp == NE_EXPR, type); })
/* Fold comparisons against infinity. */
(if (REAL_VALUE_ISINF (TREE_REAL_CST (@1))
{
volatile int nonfinite_1;
nonfinite_1 = (float) x > QNAN;
- /* { dg-final { scan-tree-dump "nonfinite_1 = \\(float\\)" "original" } } */
+ /* { dg-final { scan-tree-dump "nonfinite_1 = 0" "original" } } */
}
{
volatile int nonfinite_2;
nonfinite_2 = (float) x >= QNAN;
- /* { dg-final { scan-tree-dump "nonfinite_2 = \\(float\\)" "original" } } */
+ /* { dg-final { scan-tree-dump "nonfinite_2 = 0" "original" } } */
}
{
volatile int nonfinite_3;
nonfinite_3 = (float) x < QNAN;
- /* { dg-final { scan-tree-dump "nonfinite_3 = \\(float\\)" "original" } } */
+ /* { dg-final { scan-tree-dump "nonfinite_3 = 0" "original" } } */
}
{
volatile int nonfinite_4;
nonfinite_4 = (float) x <= QNAN;
- /* { dg-final { scan-tree-dump "nonfinite_4 = \\(float\\)" "original" } } */
+ /* { dg-final { scan-tree-dump "nonfinite_4 = 0" "original" } } */
}
{
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=c++11" } */
+
+#define big __builtin_huge_val()
+#define nan __builtin_nan("")
+
+constexpr bool b1 = big > nan;
+constexpr bool b2 = nan < big;
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fsignaling-nans -std=c++11" } */
+
+#define big __builtin_huge_val()
+#define nan __builtin_nan("")
+
+constexpr bool b1 = big > nan;
+constexpr bool b2 = nan < big;
+