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