tree-ssanames.h (set_range_info): Use value_range_base.
authorRichard Biener <rguenther@suse.de>
Tue, 13 Nov 2018 09:30:49 +0000 (09:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 13 Nov 2018 09:30:49 +0000 (09:30 +0000)
2018-11-13  Richard Biener  <rguenther@suse.de>

* tree-ssanames.h (set_range_info): Use value_range_base.
(get_range_info): Likewise.
* tree-ssanames.c (set_range_info): Likewise.
(get_range_info): Likewise.
* tree-vrp.c (value_range_base::union_helper): Split
out common parts of value_range[_base]::union_.
(value_range_base::union_): Update.
(value_range::union_): Likewise.
(determine_value_range_1): Use value_range_base.
(determine_value_range): Likewise.
* tree-vrp.h (value_range_base::union_helper): Move ...
(value_range::union_helper): ... from here.

From-SVN: r266061

gcc/ChangeLog
gcc/tree-ssanames.c
gcc/tree-ssanames.h
gcc/tree-vrp.c
gcc/tree-vrp.h

index 3f98c9001f4d0525fde145b6f0b1037a4337693a..29a216cd42dced880b6dec3473b763e2d9201370 100644 (file)
@@ -1,3 +1,18 @@
+2018-11-13  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssanames.h (set_range_info): Use value_range_base.
+       (get_range_info): Likewise.
+       * tree-ssanames.c (set_range_info): Likewise.
+       (get_range_info): Likewise.
+       * tree-vrp.c (value_range_base::union_helper): Split
+       out common parts of value_range[_base]::union_.
+       (value_range_base::union_): Update.
+       (value_range::union_): Likewise.
+       (determine_value_range_1): Use value_range_base.
+       (determine_value_range): Likewise.
+       * tree-vrp.h (value_range_base::union_helper): Move ...
+       (value_range::union_helper): ... from here.
+
 2018-11-13  Alan Modra  <amodra@gmail.com>
 
        * config/rs6000/rs6000.c (rs6000_secondary_reload_inner): Negate
index b53c4be30746aad45114c174d3a2a4a80d05687c..702b7db3ccca940a8f178b11d23586b2ee727256 100644 (file)
@@ -401,7 +401,7 @@ set_range_info (tree name, enum value_range_kind range_type,
 /* Store range information for NAME from a value_range.  */
 
 void
-set_range_info (tree name, const value_range &vr)
+set_range_info (tree name, const value_range_base &vr)
 {
   wide_int min = wi::to_wide (vr.min ());
   wide_int max = wi::to_wide (vr.max ());
@@ -434,7 +434,7 @@ get_range_info (const_tree name, wide_int *min, wide_int *max)
    in a value_range VR.  Returns the value_range_kind.  */
 
 enum value_range_kind
-get_range_info (const_tree name, value_range &vr)
+get_range_info (const_tree name, value_range_base &vr)
 {
   tree min, max;
   wide_int wmin, wmax;
index a5ff14e524ff2f353cfdf5e02c05c53792afeb80..85372e11d9f3ff2df49ac4138c036446b53105a9 100644 (file)
@@ -69,11 +69,11 @@ struct GTY ((variable_size)) range_info_def {
 /* Sets the value range to SSA.  */
 extern void set_range_info (tree, enum value_range_kind, const wide_int_ref &,
                            const wide_int_ref &);
-extern void set_range_info (tree, const value_range &);
+extern void set_range_info (tree, const value_range_base &);
 /* Gets the value range from SSA.  */
 extern enum value_range_kind get_range_info (const_tree, wide_int *,
                                             wide_int *);
-extern enum value_range_kind get_range_info (const_tree, value_range &);
+extern enum value_range_kind get_range_info (const_tree, value_range_base &);
 extern void set_nonzero_bits (tree, const wide_int_ref &);
 extern wide_int get_nonzero_bits (const_tree);
 extern bool ssa_name_has_boolean_range (tree);
index a182e643ad731190f7c2b21ee0d584ad5e4ecfdb..27bc1769f110f321ac75a67b41c6c605eb692d14 100644 (file)
@@ -6084,125 +6084,73 @@ value_range::intersect (const value_range *other)
     }
 }
 
-/* Meet operation for value ranges.  Given two value ranges VR0 and
-   VR1, store in VR0 a range that contains both VR0 and VR1.  This
-   may not be the smallest possible such range.  */
+/* Helper for meet operation for value ranges.  Given two value ranges VR0 and
+   VR1, return a range that contains both VR0 and VR1.  This may not be the
+   smallest possible such range.  */
 
-void
-value_range_base::union_ (const value_range_base *other)
+value_range_base
+value_range_base::union_helper (const value_range_base *vr0,
+                               const value_range_base *vr1)
 {
-  if (other->undefined_p ())
-    {
-      /* this already has the resulting range.  */
-      return;
-    }
+  /* VR0 has the resulting range if VR1 is undefined or VR0 is varying.  */
+  if (vr1->undefined_p ()
+      || vr0->varying_p ())
+    return *vr0;
 
-  if (this->undefined_p ())
-    {
-      *this = *other;
-      return;
-    }
+  /* VR1 has the resulting range if VR0 is undefined or VR1 is varying.  */
+  if (vr0->undefined_p ()
+      || vr1->varying_p ())
+    return *vr1;
 
-  if (this->varying_p ())
-    {
-      /* Nothing to do.  VR0 already has the resulting range.  */
-      return;
-    }
+  value_range_kind vr0type = vr0->kind ();
+  tree vr0min = vr0->min ();
+  tree vr0max = vr0->max ();
+  union_ranges (&vr0type, &vr0min, &vr0max,
+               vr1->kind (), vr1->min (), vr1->max ());
+
+  /* Work on a temporary so we can still use vr0 when union returns varying.  */
+  value_range tem;
+  tem.set_and_canonicalize (vr0type, vr0min, vr0max);
 
-  if (other->varying_p ())
+  /* Failed to find an efficient meet.  Before giving up and setting
+     the result to VARYING, see if we can at least derive a useful
+     anti-range.  */
+  if (tem.varying_p ()
+      && range_includes_zero_p (vr0) == 0
+      && range_includes_zero_p (vr1) == 0)
     {
-      this->set_varying ();
-      return;
+      tem.set_nonnull (vr0->type ());
+      return tem;
     }
 
-  value_range saved (*this);
-  value_range_kind vr0type = this->kind ();
-  tree vr0min = this->min ();
-  tree vr0max = this->max ();
-  union_ranges (&vr0type, &vr0min, &vr0max,
-               other->kind (), other->min (), other->max ());
-  *this = value_range_base (vr0type, vr0min, vr0max);
-  if (this->varying_p ())
-    {
-      /* Failed to find an efficient meet.  Before giving up and setting
-        the result to VARYING, see if we can at least derive a useful
-        anti-range.  */
-      if (range_includes_zero_p (&saved) == 0
-         && range_includes_zero_p (other) == 0)
-       {
-         tree zero = build_int_cst (saved.type (), 0);
-         *this = value_range_base (VR_ANTI_RANGE, zero, zero);
-         return;
-       }
-
-      this->set_varying ();
-      return;
-    }
-  this->set_and_canonicalize (this->kind (), this->min (), this->max ());
+  return tem;
 }
 
+
 /* Meet operation for value ranges.  Given two value ranges VR0 and
    VR1, store in VR0 a range that contains both VR0 and VR1.  This
    may not be the smallest possible such range.  */
 
 void
-value_range::union_helper (value_range *vr0, const value_range *vr1)
+value_range_base::union_ (const value_range_base *other)
 {
-  if (vr1->undefined_p ())
-    {
-      /* VR0 already has the resulting range.  */
-      return;
-    }
-
-  if (vr0->undefined_p ())
-    {
-      vr0->deep_copy (vr1);
-      return;
-    }
-
-  if (vr0->varying_p ())
+  if (dump_file && (dump_flags & TDF_DETAILS))
     {
-      /* Nothing to do.  VR0 already has the resulting range.  */
-      return;
+      fprintf (dump_file, "Meeting\n  ");
+      dump_value_range (dump_file, this);
+      fprintf (dump_file, "\nand\n  ");
+      dump_value_range (dump_file, other);
+      fprintf (dump_file, "\n");
     }
 
-  if (vr1->varying_p ())
-    {
-      vr0->set_varying ();
-      return;
-    }
+  *this = union_helper (this, other);
 
-  value_range_kind vr0type = vr0->kind ();
-  tree vr0min = vr0->min ();
-  tree vr0max = vr0->max ();
-  union_ranges (&vr0type, &vr0min, &vr0max,
-               vr1->kind (), vr1->min (), vr1->max ());
-  /* Work on a temporary so we can still use vr0 when union returns varying.  */
-  value_range tem;
-  tem.set_and_canonicalize (vr0type, vr0min, vr0max);
-  if (tem.varying_p ())
+  if (dump_file && (dump_flags & TDF_DETAILS))
     {
-      /* Failed to find an efficient meet.  Before giving up and setting
-        the result to VARYING, see if we can at least derive a useful
-        anti-range.  */
-      if (range_includes_zero_p (vr0) == 0
-         && range_includes_zero_p (vr1) == 0)
-       {
-         vr0->set_nonnull (vr0->type ());
-         return;
-       }
-
-      vr0->set_varying ();
-      return;
+      fprintf (dump_file, "to\n  ");
+      dump_value_range (dump_file, this);
+      fprintf (dump_file, "\n");
     }
-  vr0->update (tem.kind (), tem.min (), tem.max ());
-
-  /* The resulting set of equivalences is always the intersection of
-     the two sets.  */
-  if (vr0->m_equiv && vr1->m_equiv && vr0->m_equiv != vr1->m_equiv)
-    bitmap_and_into (vr0->m_equiv, vr1->m_equiv);
-  else if (vr0->m_equiv && !vr1->m_equiv)
-    bitmap_clear (vr0->m_equiv);
 }
 
 void
@@ -6216,7 +6164,24 @@ value_range::union_ (const value_range *other)
       dump_value_range (dump_file, other);
       fprintf (dump_file, "\n");
     }
-  union_helper (this, other);
+
+  /* If THIS is undefined we want to pick up equivalences from OTHER.
+     Just special-case this here rather than trying to fixup after the fact.  */
+  if (this->undefined_p ())
+    this->deep_copy (other);
+  else
+    {
+      value_range_base tem = union_helper (this, other);
+      this->update (tem.kind (), tem.min (), tem.max ());
+
+      /* The resulting set of equivalences is always the intersection of
+        the two sets.  */
+      if (this->m_equiv && other->m_equiv && this->m_equiv != other->m_equiv)
+       bitmap_and_into (this->m_equiv, other->m_equiv);
+      else if (this->m_equiv && !other->m_equiv)
+       bitmap_clear (this->m_equiv);
+    }
+
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       fprintf (dump_file, "to\n  ");
@@ -6867,11 +6832,11 @@ make_pass_vrp (gcc::context *ctxt)
 /* Worker for determine_value_range.  */
 
 static void
-determine_value_range_1 (value_range *vr, tree expr)
+determine_value_range_1 (value_range_base *vr, tree expr)
 {
   if (BINARY_CLASS_P (expr))
     {
-      value_range vr0, vr1;
+      value_range_base vr0, vr1;
       determine_value_range_1 (&vr0, TREE_OPERAND (expr, 0));
       determine_value_range_1 (&vr1, TREE_OPERAND (expr, 1));
       extract_range_from_binary_expr (vr, TREE_CODE (expr), TREE_TYPE (expr),
@@ -6879,7 +6844,7 @@ determine_value_range_1 (value_range *vr, tree expr)
     }
   else if (UNARY_CLASS_P (expr))
     {
-      value_range vr0;
+      value_range_base vr0;
       determine_value_range_1 (&vr0, TREE_OPERAND (expr, 0));
       extract_range_from_unary_expr (vr, TREE_CODE (expr), TREE_TYPE (expr),
                                     &vr0, TREE_TYPE (TREE_OPERAND (expr, 0)));
@@ -6908,7 +6873,7 @@ determine_value_range_1 (value_range *vr, tree expr)
 value_range_kind
 determine_value_range (tree expr, wide_int *min, wide_int *max)
 {
-  value_range vr;
+  value_range_base vr;
   determine_value_range_1 (&vr, expr);
   if (vr.constant_p ())
     {
index ae7dcc7b58e3d30beac93a42458273959560acae..348fa4f0e7bc67ca252ac0163a70cb8a07d56391 100644 (file)
@@ -77,6 +77,8 @@ public:
 
 protected:
   void check ();
+  static value_range_base union_helper (const value_range_base *,
+                                       const value_range_base *);
 
   enum value_range_kind m_kind;
 
@@ -145,7 +147,6 @@ class GTY((user)) value_range : public value_range_base
   void check ();
   bool equal_p (const value_range &, bool ignore_equivs) const;
   void intersect_helper (value_range *, const value_range *);
-  void union_helper (value_range *, const value_range *);
 
   /* Set of SSA names whose value ranges are equivalent to this one.
      This set is only valid when TYPE is VR_RANGE or VR_ANTI_RANGE.  */