On 3/31/23 12:57, Jakub Jelinek wrote:
On Fri, Mar 31, 2023 at 12:45:10PM +0200, Jakub Jelinek via Gcc-patches wrote:
    - there is a missing case (not handled in this patch) where both operands
      are known to be zeros, but not singleton zeros

This patch adds those cases.

Ok for trunk if it passes bootstrap/regtest?

LGTM.

Thanks so much for taking care of all this.
Aldy


2023-03-31  Jakub Jelinek  <ja...@redhat.com>

        * range-op-float.cc (foperator_equal::fold_range): If at least
        one of the op ranges is not singleton and neither is NaN and all
        4 bounds are zero, return [1, 1].
        (foperator_not_equal::fold_range): In the same case return [0, 0].

--- gcc/range-op-float.cc.jj    2023-03-31 11:23:04.817876083 +0200
+++ gcc/range-op-float.cc       2023-03-31 12:51:34.757480162 +0200
@@ -616,6 +616,13 @@ foperator_equal::fold_range (irange &r,
        else
        r = range_false (type);
      }
+  else if (real_iszero (&op1.lower_bound ())
+          && real_iszero (&op1.upper_bound ())
+          && real_iszero (&op2.lower_bound ())
+          && real_iszero (&op2.upper_bound ())
+          && !maybe_isnan (op1, op2))
+    // [-0.0, 0.0] == [-0.0, 0.0] or similar.
+    r = range_true (type);
    else
      {
        // If ranges do not intersect, we know the range is not equal,
@@ -732,6 +739,13 @@ foperator_not_equal::fold_range (irange
        else
        r = range_true (type);
      }
+  else if (real_iszero (&op1.lower_bound ())
+          && real_iszero (&op1.upper_bound ())
+          && real_iszero (&op2.lower_bound ())
+          && real_iszero (&op2.upper_bound ())
+          && !maybe_isnan (op1, op2))
+    // [-0.0, 0.0] != [-0.0, 0.0] or similar.
+    r = range_false (type);
    else
      {
        // If ranges do not intersect, we know the range is not equal,


        Jakub


Reply via email to