Per the function comment, the caller to intersect(wide_int, wide_int) must handle the mask. This means it must also normalize the range if anything changed.
gcc/ChangeLog: * value-range.cc (irange::intersect): Leave normalization to caller. --- gcc/value-range.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 8e5607a7eeb..fbc0c7a6f82 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -1475,6 +1475,8 @@ irange::intersect (const vrange &v) return true; res |= intersect_bitmask (r); + if (res) + normalize_kind (); return res; } @@ -1574,7 +1576,7 @@ irange::intersect (const vrange &v) // Multirange intersect for a specified wide_int [lb, ub] range. // Return TRUE if intersect changed anything. // -// NOTE: It is the caller's responsibility to intersect the nonzero masks. +// NOTE: It is the caller's responsibility to intersect the mask. bool irange::intersect (const wide_int& lb, const wide_int& ub) @@ -1633,7 +1635,8 @@ irange::intersect (const wide_int& lb, const wide_int& ub) } m_kind = VR_RANGE; - normalize_kind (); + // The caller must normalize and verify the range, as the bitmask + // still needs to be handled. return true; } -- 2.40.1