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;
     }
 }

Reply via email to