https://gcc.gnu.org/g:65cd212bd4c533351a09e6974f40ae5d7effca84
commit r16-663-g65cd212bd4c533351a09e6974f40ae5d7effca84 Author: Andrew MacLeod <amacl...@redhat.com> Date: Wed May 14 11:12:22 2025 -0400 Improve constant bitmasks. bitmasks for constants are created only for trailing zeros. It is no additional work to also include leading 1's in the value that are also known. before : [5, 7] mask 0x7 value 0x0 after : [5, 7] mask 0x3 value 0x4 PR tree-optimization/116546 * value-range.cc (irange_bitmask::irange_bitmask): Include leading ones in the bitmask. Diff: --- gcc/value-range.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 48a1521b81ec..64d10f41168b 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -47,9 +47,11 @@ irange_bitmask::irange_bitmask (tree type, else { wide_int xorv = min ^ max; - xorv = wi::mask (prec - wi::clz (xorv), false, prec); - m_value = wi::zero (prec); - m_mask = min | xorv; + // Mask will have leading zeros for all leading bits that are + // common, both zeros and ones. + m_mask = wi::mask (prec - wi::clz (xorv), false, prec); + // Now set value to those bits which are known, and zero the rest. + m_value = ~m_mask & min; } }