Le 28/10/2024 à 14:38, Andrew MacLeod a écrit :
On 10/26/24 15:08, Mikael Morin wrote:
Hello,
Le 24/10/2024 à 14:53, Andrew MacLeod a écrit :
diff --git a/gcc/range-op-ptr.cc b/gcc/range-op-ptr.cc
index dd312a80366..ef2b2cce516 100644
--- a/gcc/range-op-ptr.cc
+++ b/gcc/range-op-ptr.cc
(...)
-void
-pointer_or_operator::wi_fold (irange &r, tree type,
- const wide_int &lh_lb,
- const wide_int &lh_ub,
- const wide_int &rh_lb,
- const wide_int &rh_ub) const
+operator_bitwise_or::fold_range (prange &r, tree type,
+ const prange &op1,
+ const prange &op2,
+ relation_trio) const
{
// For pointer types, we are really only interested in asserting
// whether the expression evaluates to non-NULL.
- if (!wi_includes_zero_p (type, lh_lb, lh_ub)
- && !wi_includes_zero_p (type, rh_lb, rh_ub))
+ if (!op1.zero_p () || !op2.zero_p ())
r.set_nonzero (type);
this doesn't feel right. It checks that the operand range is anything
but singleton [0], instead of checking that it does not contain 0.
Hmm, i think you are right. But I also think the original is wrong?
Shouldn't it be nonzero if either operand doesn't contain zero?
It's Monday morning.. Check my logic please... :-)
The original wasn't strictly speaking wrong; I mean it was just
producing more VARYING than necessary.
But otherwise, yes, your logic appears correct.
diff --git a/gcc/range-op-ptr.cc b/gcc/range-op-ptr.cc
index 9f500c52d2c..ccce05035b9 100644
--- a/gcc/range-op-ptr.cc
+++ b/gcc/range-op-ptr.cc
@@ -388,7 +388,7 @@ operator_bitwise_or::fold_range (prange &r, tree type,
{
// For pointer types, we are really only interested in asserting
// whether the expression evaluates to non-NULL.
- if (!op1.zero_p () || !op2.zero_p ())
+ if (!range_includes_zero_p (op1) || !range_includes_zero_p (op2))
r.set_nonzero (type);
else if (op1.zero_p () && op2.zero_p ())
r.set_zero (type);
And this looks good.