https://gcc.gnu.org/g:f24e10876689dcd92b05756bd3ec833ddf1e6b7e
commit r15-4599-gf24e10876689dcd92b05756bd3ec833ddf1e6b7e Author: Andrew MacLeod <amacl...@redhat.com> Date: Wed Oct 23 10:59:13 2024 -0400 Implement pointer_or_operator. The class pointer_or is no longer used, and can be removed. Its functionality was never moved to the new dispatch system. This implements operator_bitwise_or::fold_range() for prange operands. * range-op-mixed.h (operator_bitwise_or::fold_range): Add prange variant. * range-op-ptr.cc (class pointer_or_operator): Remove. (pointer_or_operator::op1_range): Remove. (pointer_or_operator::op2_range): Remove. (pointer_or_operator::wi_fold): Remove. (operator_bitwise_or::fold_range): New prange variant. Diff: --- gcc/range-op-mixed.h | 6 +++++ gcc/range-op-ptr.cc | 63 +++++++++------------------------------------------- 2 files changed, 16 insertions(+), 53 deletions(-) diff --git a/gcc/range-op-mixed.h b/gcc/range-op-mixed.h index cc1db2f67758..f7c447d935e3 100644 --- a/gcc/range-op-mixed.h +++ b/gcc/range-op-mixed.h @@ -809,9 +809,15 @@ protected: class operator_bitwise_or : public range_operator { public: + using range_operator::fold_range; using range_operator::op1_range; using range_operator::op2_range; using range_operator::update_bitmask; + + bool fold_range (prange &r, tree type, + const prange &op1, + const prange &op2, + relation_trio) const final override; bool op1_range (irange &r, tree type, const irange &lhs, const irange &op2, relation_trio rel = TRIO_VARYING) const override; diff --git a/gcc/range-op-ptr.cc b/gcc/range-op-ptr.cc index dd312a803660..ef2b2cce5167 100644 --- a/gcc/range-op-ptr.cc +++ b/gcc/range-op-ptr.cc @@ -379,69 +379,26 @@ pointer_plus_operator::op2_range (irange &r, tree type, return true; } - -class pointer_or_operator : public range_operator -{ -public: - using range_operator::op1_range; - using range_operator::op2_range; - virtual bool op1_range (irange &r, tree type, - const irange &lhs, - const irange &op2, - relation_trio rel = TRIO_VARYING) const; - virtual bool op2_range (irange &r, tree type, - const irange &lhs, - const irange &op1, - relation_trio rel = TRIO_VARYING) const; - virtual void 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; -} op_pointer_or; - -bool -pointer_or_operator::op1_range (irange &r, tree type, - const irange &lhs, - const irange &op2 ATTRIBUTE_UNUSED, - relation_trio) const -{ - if (lhs.undefined_p ()) - return false; - if (lhs.zero_p ()) - { - r.set_zero (type); - return true; - } - r.set_varying (type); - return true; -} - bool -pointer_or_operator::op2_range (irange &r, tree type, - const irange &lhs, - const irange &op1, - relation_trio) const -{ - return pointer_or_operator::op1_range (r, type, lhs, op1); -} - -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); - else if (wi_zero_p (type, lh_lb, lh_ub) && wi_zero_p (type, rh_lb, rh_ub)) + else if (op1.zero_p () && op2.zero_p ()) r.set_zero (type); else r.set_varying (type); + + update_known_bitmask (r, BIT_IOR_EXPR, op1, op2); + return true; } + class operator_pointer_diff : public range_operator { using range_operator::fold_range;