Use the value_range_base constructors in value_range_base::invert to
authorAldy Hernandez <aldyh@redhat.com>
Mon, 4 Nov 2019 21:41:12 +0000 (21:41 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Mon, 4 Nov 2019 21:41:12 +0000 (21:41 +0000)
make sure we build canonically correct ranges.

From-SVN: r277794

gcc/ChangeLog
gcc/tree-vrp.c

index c585360b537d73eec31df4f011ad97e79b0e6310..6bdd5ffddbd7b2c01d0cb13c066c2f0b06d49fb1 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-04  Aldy Hernandez  <aldyh@redhat.com>
+
+       * tree-vrp.c (value_range_base::invert): Use constructors to build
+       range.
+
 2019-11-04  Aldy Hernandez  <aldyh@redhat.com>
 
        * tree-vrp.c (range_int_cst_singleton_p): Remove.
index 070db903147f2baace5697d56b9986812015139b..085308e519feb02762caf444126eecdaec4b8df2 100644 (file)
@@ -6286,10 +6286,12 @@ value_range_base::contains_p (tree cst) const
 void
 value_range_base::invert ()
 {
+  /* We can't just invert VR_RANGE and VR_ANTI_RANGE because we may
+     create non-canonical ranges.  Use the constructors instead.  */
   if (m_kind == VR_RANGE)
-    m_kind = VR_ANTI_RANGE;
+    *this = value_range_base (VR_ANTI_RANGE, m_min, m_max);
   else if (m_kind == VR_ANTI_RANGE)
-    m_kind = VR_RANGE;
+    *this = value_range_base (VR_RANGE, m_min, m_max);
   else
     gcc_unreachable ();
 }