https://gcc.gnu.org/g:6a4da727020b24b02b062f4bff718c9a5699629c
commit r16-1397-g6a4da727020b24b02b062f4bff718c9a5699629c Author: Andrew MacLeod <amacl...@redhat.com> Date: Tue Jun 10 12:11:18 2025 -0400 Check if constant is a member before returning it. set_range_from_bitmask checks the new bitmask, and if it is a constant, simply returns the constant. It never checks if that constant is actually within the range. If it is not, the result should be UNDEFINED. * value-range.cc (irange::set_range_from_bitmask): When the bitmask result is a singleton, check if it is contained in the range. Diff: --- gcc/value-range.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gcc/value-range.cc b/gcc/value-range.cc index ed3760fa6ff6..e2d75f59c2e0 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -2268,7 +2268,11 @@ irange::set_range_from_bitmask () // If all the bits are known, this is a singleton. if (m_bitmask.mask () == 0) { - set (m_type, m_bitmask.value (), m_bitmask.value ()); + // Make sure the singleton is within the range. + if (contains_p (m_bitmask.value ())) + set (m_type, m_bitmask.value (), m_bitmask.value ()); + else + set_undefined (); return true; }