re PR tree-optimization/87415 (wrong code at -O1 and above on x86_64-linux-gnu)
authorAldy Hernandez <aldyh@redhat.com>
Wed, 3 Oct 2018 17:36:29 +0000 (17:36 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Wed, 3 Oct 2018 17:36:29 +0000 (17:36 +0000)
PR tree-optimization/87415
* tree-vrp.c (set_value_range_with_overflow): Special case one bit
precision fields.

From-SVN: r264817

gcc/ChangeLog
gcc/testsuite/gcc.dg/pr87415.c [new file with mode: 0644]
gcc/tree-vrp.c

index aa10aa07269f984b325f119375f6c5e7ec9ba3ae..30d7e775c61127b8f386f66313bbf2b1c908f17f 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-03  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR tree-optimization/87415
+       * tree-vrp.c (set_value_range_with_overflow): Special case one bit
+       precision fields.
+
 2018-10-02  Jeff Law  <law@redhat.com>
 
        * gimple-fold.c (get_range_strlen): Only set *nonstr when
diff --git a/gcc/testsuite/gcc.dg/pr87415.c b/gcc/testsuite/gcc.dg/pr87415.c
new file mode 100644 (file)
index 0000000..473384a
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+struct A
+{
+  int b:1;
+};
+
+int d;
+
+int main ()
+{
+  struct A e = { 0 };
+  if (!d)
+    e.b = -1;
+  if (!e.b)
+    __builtin_abort ();
+
+  return 0;
+}
index 005fc2ffe2ddcb8da657195dd6936dd527b96f25..cbc2ea2f26b911117667e8f769e3dcd33638fe9e 100644 (file)
@@ -1116,6 +1116,15 @@ set_value_range_with_overflow (value_range &vr,
   const unsigned int prec = TYPE_PRECISION (type);
   vr.type = VR_RANGE;
   vr.equiv = NULL;
+
+  /* For one bit precision if max < min, then the swapped
+     range covers all values.  */
+  if (prec == 1 && wi::lt_p (wmax, wmin, sgn))
+    {
+      set_value_range_to_varying (&vr);
+      return;
+    }
+
   if (TYPE_OVERFLOW_WRAPS (type))
     {
       /* If overflow wraps, truncate the values and adjust the