]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
A singleton irange has all known bits.
authorAldy Hernandez <aldyh@redhat.com>
Thu, 6 Jul 2023 09:23:04 +0000 (11:23 +0200)
committerAldy Hernandez <aldyh@redhat.com>
Fri, 7 Jul 2023 07:55:58 +0000 (09:55 +0200)
gcc/ChangeLog:

* value-range.cc (irange::get_bitmask_from_range): Return all the
known bits for a singleton.
(irange::set_range_from_bitmask): Set a range of a singleton when
all bits are known.

gcc/value-range.cc

index fbc0c7a6f821426a2aa879490caba7147a50e300..011bdbdeae62845b5627a8dfa0d261370df7e5db 100644 (file)
@@ -1766,10 +1766,19 @@ irange::invert ()
 irange_bitmask
 irange::get_bitmask_from_range () const
 {
+  unsigned prec = TYPE_PRECISION (type ());
   wide_int min = lower_bound ();
   wide_int max = upper_bound ();
+
+  // All the bits of a singleton are known.
+  if (min == max)
+    {
+      wide_int mask = wi::zero (prec);
+      wide_int value = lower_bound ();
+      return irange_bitmask (value, mask);
+    }
+
   wide_int xorv = min ^ max;
-  unsigned prec = TYPE_PRECISION (type ());
 
   if (xorv != 0)
     xorv = wi::mask (prec - wi::clz (xorv), false, prec);
@@ -1786,6 +1795,14 @@ irange::set_range_from_bitmask ()
   gcc_checking_assert (!undefined_p ());
   if (m_bitmask.unknown_p ())
     return false;
+
+  // If all the bits are known, this is a singleton.
+  if (m_bitmask.mask () == 0)
+    {
+      set (m_type, m_bitmask.value (), m_bitmask.value ());
+      return true;
+    }
+
   unsigned popcount = wi::popcount (m_bitmask.get_nonzero_bits ());
 
   // If we have only one bit set in the mask, we can figure out the