]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Handle setting of 1-bit anti-ranges uniformly.
authorAldy Hernandez <aldyh@redhat.com>
Thu, 18 Mar 2021 15:05:27 +0000 (16:05 +0100)
committerAldy Hernandez <aldyh@redhat.com>
Tue, 23 Mar 2021 06:57:41 +0000 (02:57 -0400)
PR tree-optimization/99296
* value-range.cc (irange::irange_set_1bit_anti_range): New.
(irange::irange_set_anti_range): Call irange_set_1bit_anti_range
* value-range.h (irange::irange_set_1bit_anti_range): New.

gcc/testsuite/gcc.dg/pr99296.c [new file with mode: 0644]
gcc/value-range.cc
gcc/value-range.h

diff --git a/gcc/testsuite/gcc.dg/pr99296.c b/gcc/testsuite/gcc.dg/pr99296.c
new file mode 100644 (file)
index 0000000..4a0b3f0
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-O2 -fno-tree-bit-ccp" }
+
+struct {
+  signed a : 1;
+} b, c;
+void d() { b.a |= c.a |= 0 != 2; }
index 9c42f82a10585e38587798259fdc13ad8395c439..cd21f75909bf694265b0ac2ea4b119e136362fab 100644 (file)
@@ -184,12 +184,43 @@ irange::irange_set (tree min, tree max)
     verify_range ();
 }
 
+void
+irange::irange_set_1bit_anti_range (tree min, tree max)
+{
+  tree type = TREE_TYPE (min);
+  gcc_checking_assert (TYPE_PRECISION (type) == 1);
+
+  if (operand_equal_p (min, max))
+    {
+      // Since these are 1-bit quantities, they can only be [MIN,MIN]
+      // or [MAX,MAX].
+      if (vrp_val_is_min (min))
+       min = max = vrp_val_max (type);
+      else
+       min = max = vrp_val_min (type);
+      set (min, max);
+    }
+  else
+    {
+      // The only alternative is [MIN,MAX], which is the empty range.
+      set_undefined ();
+    }
+  if (flag_checking)
+    verify_range ();
+}
+
 void
 irange::irange_set_anti_range (tree min, tree max)
 {
   gcc_checking_assert (!POLY_INT_CST_P (min));
   gcc_checking_assert (!POLY_INT_CST_P (max));
 
+  if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
+    {
+      irange_set_1bit_anti_range (min, max);
+      return;
+    }
+
   // set an anti-range
   tree type = TREE_TYPE (min);
   signop sign = TYPE_SIGN (type);
index 8a4d8ec42078686ed6889e9d359c937d7e1d694e..bfc54a2473ffa284da872453daf44bef27a01510 100644 (file)
@@ -127,6 +127,8 @@ protected:
   void copy_legacy_to_multi_range (const irange &);
 
 private:
+  void irange_set_1bit_anti_range (tree, tree);
+
   unsigned char m_num_ranges;
   unsigned char m_max_ranges;
   ENUM_BITFIELD(value_range_kind) m_kind : 8;