From: Andrew MacLeod Date: Sat, 10 Jun 2023 20:33:17 +0000 (-0400) Subject: Add a hybrid BIT_IOR_EXPR operator for integer and pointer. X-Git-Tag: basepoints/gcc-15~8411 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=af5e7f0629dc56be3cc7df75fbb407f0dfd72252;p=thirdparty%2Fgcc.git Add a hybrid BIT_IOR_EXPR operator for integer and pointer. This adds an operator to the unified table for BIT_IOR_EXPR which will select either the pointer or integer version based on the type passed to the method. This is for use until we have a seperate PRANGE class. * range-op-mixed.h (operator_bitwise_or): Remove final. * range-op-ptr.cc (pointer_table::pointer_table): Remove BIT_IOR_EXPR. (class hybrid_or_operator): New. (range_op_table::initialize_pointer_ops): Add hybrid_or_operator. * range-op.cc (unified_table::unified_table): Comment out BIT_IOR_EXPR. --- diff --git a/gcc/range-op-mixed.h b/gcc/range-op-mixed.h index 4177818e4b93..e4852e974c49 100644 --- a/gcc/range-op-mixed.h +++ b/gcc/range-op-mixed.h @@ -609,16 +609,16 @@ public: using range_operator::op2_range; bool op1_range (irange &r, tree type, const irange &lhs, const irange &op2, - relation_trio rel = TRIO_VARYING) const final override; + relation_trio rel = TRIO_VARYING) const override; bool op2_range (irange &r, tree type, const irange &lhs, const irange &op1, - relation_trio rel = TRIO_VARYING) const final override; + relation_trio rel = TRIO_VARYING) const override; void update_bitmask (irange &r, const irange &lh, - const irange &rh) const final override; -private: + const irange &rh) const override; +protected: 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 final override; + const wide_int &rh_ub) const override; }; class operator_min : public range_operator diff --git a/gcc/range-op-ptr.cc b/gcc/range-op-ptr.cc index 941026994ed4..7b22d0bf05b3 100644 --- a/gcc/range-op-ptr.cc +++ b/gcc/range-op-ptr.cc @@ -184,9 +184,9 @@ pointer_and_operator::wi_fold (irange &r, tree type, class pointer_or_operator : public range_operator { +public: using range_operator::op1_range; using range_operator::op2_range; -public: virtual bool op1_range (irange &r, tree type, const irange &lhs, const irange &op2, @@ -270,7 +270,6 @@ operator_pointer_diff::op1_op2_relation_effect (irange &lhs_range, tree type, pointer_table::pointer_table () { - set (BIT_IOR_EXPR, op_pointer_or); set (MIN_EXPR, op_ptr_min_max); set (MAX_EXPR, op_ptr_min_max); } @@ -334,6 +333,54 @@ public: } } op_hybrid_and; +// Temporary class which dispatches routines to either the INT version or +// the pointer version depending on the type. Once PRANGE is a range +// class, we can remove the hybrid. + +class hybrid_or_operator : public operator_bitwise_or +{ +public: + using range_operator::op1_range; + using range_operator::op2_range; + using range_operator::lhs_op1_relation; + bool op1_range (irange &r, tree type, + const irange &lhs, const irange &op2, + relation_trio rel = TRIO_VARYING) const final override + { + if (INTEGRAL_TYPE_P (type)) + return operator_bitwise_or::op1_range (r, type, lhs, op2, rel); + else + return op_pointer_or.op1_range (r, type, lhs, op2, rel); + } + bool op2_range (irange &r, tree type, + const irange &lhs, const irange &op1, + relation_trio rel = TRIO_VARYING) const final override + { + if (INTEGRAL_TYPE_P (type)) + return operator_bitwise_or::op2_range (r, type, lhs, op1, rel); + else + return op_pointer_or.op2_range (r, type, lhs, op1, rel); + } + void update_bitmask (irange &r, const irange &lh, + const irange &rh) const final override + { + if (!r.undefined_p () && INTEGRAL_TYPE_P (r.type ())) + operator_bitwise_or::update_bitmask (r, lh, rh); + } + + 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 final override + { + if (INTEGRAL_TYPE_P (type)) + return operator_bitwise_or::wi_fold (r, type, lh_lb, lh_ub, + rh_lb, rh_ub); + else + return op_pointer_or.wi_fold (r, type, lh_lb, lh_ub, rh_lb, rh_ub); + } +} op_hybrid_or; + + // Initialize any pointer operators to the primary table @@ -343,4 +390,5 @@ range_op_table::initialize_pointer_ops () set (POINTER_PLUS_EXPR, op_pointer_plus); set (POINTER_DIFF_EXPR, op_pointer_diff); set (BIT_AND_EXPR, op_hybrid_and); + set (BIT_IOR_EXPR, op_hybrid_or); } diff --git a/gcc/range-op.cc b/gcc/range-op.cc index dcb922143ce7..0a9a3297de7e 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -121,8 +121,8 @@ unified_table::unified_table () // is used until there is a pointer range class. Then we can simply // uncomment the operator here and use the unified version. - //set (BIT_AND_EXPR, op_bitwise_and); - set (BIT_IOR_EXPR, op_bitwise_or); + // set (BIT_AND_EXPR, op_bitwise_and); + // set (BIT_IOR_EXPR, op_bitwise_or); set (MIN_EXPR, op_min); set (MAX_EXPR, op_max); }