From 8605bd9321010f15c471d511de5a06bbd9cc7c4b Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Wed, 26 Jul 2023 11:00:08 +0200 Subject: [PATCH] [range-ops] Remove special case for handling bitmasks in casts. Now that we can generically handle bitmasks for unary operators, there's no need to special case them. gcc/ChangeLog: * range-op-mixed.h (class operator_cast): Add update_bitmask. * range-op.cc (operator_cast::update_bitmask): New. (operator_cast::fold_range): Call update_bitmask. --- gcc/range-op-mixed.h | 2 ++ gcc/range-op.cc | 23 ++++++++--------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/gcc/range-op-mixed.h b/gcc/range-op-mixed.h index 70550c52232..3cb904f9d80 100644 --- a/gcc/range-op-mixed.h +++ b/gcc/range-op-mixed.h @@ -346,6 +346,8 @@ public: relation_kind lhs_op1_relation (const irange &lhs, const irange &op1, const irange &op2, relation_kind) const final override; + void update_bitmask (irange &r, const irange &lh, + const irange &rh) const final override; private: bool truncating_cast_p (const irange &inner, const irange &outer) const; bool inside_domain_p (const wide_int &min, const wide_int &max, diff --git a/gcc/range-op.cc b/gcc/range-op.cc index 5653ca0d186..615e5fe0036 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -2881,24 +2881,17 @@ operator_cast::fold_range (irange &r, tree type ATTRIBUTE_UNUSED, return true; } - // Update the bitmask. Truncating casts are problematic unless - // the conversion fits in the resulting outer type. - irange_bitmask bm = inner.get_bitmask (); - if (truncating_cast_p (inner, outer) - && wi::rshift (bm.mask (), - wi::uhwi (TYPE_PRECISION (outer.type ()), - TYPE_PRECISION (inner.type ())), - TYPE_SIGN (inner.type ())) != 0) - return true; - unsigned prec = TYPE_PRECISION (type); - signop sign = TYPE_SIGN (inner.type ()); - bm = irange_bitmask (wide_int::from (bm.value (), prec, sign), - wide_int::from (bm.mask (), prec, sign)); - r.update_bitmask (bm); - + update_bitmask (r, inner, outer); return true; } +void +operator_cast::update_bitmask (irange &r, const irange &lh, + const irange &rh) const +{ + update_known_bitmask (r, CONVERT_EXPR, lh, rh); +} + bool operator_cast::op1_range (irange &r, tree type, const irange &lhs,