]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
range-op-float: Further foperator_{,not_}equal::fold_range fix
authorJakub Jelinek <jakub@redhat.com>
Sat, 1 Apr 2023 07:32:20 +0000 (09:32 +0200)
committerJakub Jelinek <jakub@redhat.com>
Sat, 1 Apr 2023 07:32:20 +0000 (09:32 +0200)
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.

2023-04-01  Jakub Jelinek  <jakub@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

index 0e0fd92ff2e94079ad275c9b1bd8d98a8e20e9fe..41d497e96ade884af13e45a919eebea7070e9ef6 100644 (file)
@@ -616,6 +616,13 @@ foperator_equal::fold_range (irange &r, tree type,
       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 &r, tree type,
       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,