commit eac5cbfa507146166498e395d9347efdf46d3ef4
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Tue Jun 4 09:11:22 2019 +0200

    value_range_base::contains_p and may_contains_p.

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bee0a75a000..4f5c1798751 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2019-06-11  Aldy Hernandez  <aldyh@redhat.com>
+
+	* gimple-loop-versioning.cc (prune_loop_conditions): Use
+	value_range_base::contains_p.
+	* tree-vrp.c (value_range_base::may_contain_p): Remove.
+	(value_inside_range): Make private to value_range_base class.
+	(value_range_base::contains_p): New.
+	* tree-vrp.h (value_range_base): Remove may_contain_p.  Add
+	contains_p.  Add value_inside_range.
+	(range_includes_p): Remove.
+	(value_inside_range): Remove.
+	(range_includes_p): Use value_range_base::contains_p.
+	* vr-values.c (compare_range_with_value): Same.
+
 2019-06-11  Aldy Hernandez  <aldyh@redhat.com>
 
 	* gimple-ssa-evrp.c (evrp_dom_walker::before_dom_children): Use
diff --git a/gcc/gimple-loop-versioning.cc b/gcc/gimple-loop-versioning.cc
index a2f68bf08db..85468fa06c4 100644
--- a/gcc/gimple-loop-versioning.cc
+++ b/gcc/gimple-loop-versioning.cc
@@ -1489,7 +1489,8 @@ loop_versioning::prune_loop_conditions (struct loop *loop, vr_values *vrs)
     {
       tree name = ssa_name (i);
       value_range *vr = vrs->get_value_range (name);
-      if (vr && !range_includes_p (vr, 1))
+      if (vr && (!vr->contains_p (build_one_cst (TREE_TYPE (name)))
+		 && !vr->undefined_p ()))
 	{
 	  if (dump_enabled_p ())
 	    dump_printf_loc (MSG_NOTE, find_loop_location (loop),
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 08e6c6b6111..58ca9fa0d34 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -292,25 +292,6 @@ value_range::set_varying (tree type)
   equiv_clear ();
 }
 
-/* Return TRUE if it is possible that range contains VAL.  */
-
-bool
-value_range_base::may_contain_p (tree val) const
-{
-  if (varying_p ())
-    return true;
-
-  if (undefined_p ())
-    return true;
-
-  if (m_kind == VR_ANTI_RANGE)
-    {
-      int res = value_inside_range (val, min (), max ());
-      return res == 0 || res == -2;
-    }
-  return value_inside_range (val, min (), max ()) != 0;
-}
-
 void
 value_range::equiv_clear ()
 {
@@ -1160,7 +1141,7 @@ compare_values (tree val1, tree val2)
    function.  */
 
 int
-value_inside_range (tree val, tree min, tree max)
+value_range_base::value_inside_range (tree val, tree min, tree max) const
 {
   int cmp1, cmp2;
 
@@ -1177,15 +1158,23 @@ value_inside_range (tree val, tree min, tree max)
   return !cmp2;
 }
 
-
-/* Return TRUE if *VR includes the value X.  */
+/* Return TRUE if range contains VAL.  */
 
 bool
-range_includes_p (const value_range_base *vr, HOST_WIDE_INT x)
+value_range_base::contains_p (tree val) const
 {
-  if (vr->varying_p () || vr->undefined_p ())
+  if (varying_p ())
     return true;
-  return vr->may_contain_p (build_int_cst (vr->type (), x));
+
+  if (undefined_p ())
+    return false;
+
+  if (m_kind == VR_ANTI_RANGE)
+    {
+      int res = value_inside_range (val, min (), max ());
+      return res == 0 || res == -2;
+    }
+  return value_inside_range (val, min (), max ()) != 0;
 }
 
 /* Value range wrapper for wide_int_range_set_zero_nonzero_bits.
diff --git a/gcc/tree-vrp.h b/gcc/tree-vrp.h
index e48cc37bafc..3abe0f7fe98 100644
--- a/gcc/tree-vrp.h
+++ b/gcc/tree-vrp.h
@@ -70,7 +70,7 @@ public:
 
   /* Misc methods.  */
   tree type () const;
-  bool may_contain_p (tree) const;
+  bool contains_p (tree) const;
   void set_and_canonicalize (enum value_range_kind, tree, tree);
   bool zero_p () const;
   bool nonzero_p () const;
@@ -97,6 +97,9 @@ protected:
   friend void gt_ggc_mx (value_range_base *&);
   friend void gt_pch_nx (value_range_base &);
   friend void gt_pch_nx (value_range_base *, gt_pointer_operator, void *);
+
+private:
+  int value_inside_range (tree, tree, tree) const;
 };
 
 /* Note value_range cannot currently be used with GC memory, only
@@ -254,7 +257,6 @@ struct assert_info
 extern void register_edge_assert_for (tree, edge, enum tree_code,
 				      tree, tree, vec<assert_info> &);
 extern bool stmt_interesting_for_vrp (gimple *);
-extern bool range_includes_p (const value_range_base *, HOST_WIDE_INT);
 extern bool infer_value_range (gimple *, tree, tree_code *, tree *);
 
 extern bool vrp_bitmap_equal_p (const_bitmap, const_bitmap);
@@ -267,7 +269,6 @@ extern int compare_values_warnv (tree, tree, bool *);
 extern int operand_less_p (tree, tree);
 extern bool vrp_val_is_min (const_tree);
 extern bool vrp_val_is_max (const_tree);
-extern int value_inside_range (tree, tree, tree);
 
 extern tree vrp_val_min (const_tree);
 extern tree vrp_val_max (const_tree);
@@ -300,7 +301,11 @@ extern value_range_kind determine_value_range (tree, wide_int *, wide_int *);
 inline bool
 range_includes_zero_p (const value_range_base *vr)
 {
-  return range_includes_p (vr, 0);
+  /* ?? I'm not convinced we should return TRUE for undefined.  */
+  /* Short-circuit these because they don't have a type.  */
+  if (vr->undefined_p () || vr->varying_p ())
+    return true;
+  return vr->contains_p (build_zero_cst (vr->type ()));
 }
 
 #endif /* GCC_TREE_VRP_H */
diff --git a/gcc/vr-values.c b/gcc/vr-values.c
index 1c05ffb7f17..77b036a8ae6 100644
--- a/gcc/vr-values.c
+++ b/gcc/vr-values.c
@@ -1626,8 +1626,7 @@ compare_range_with_value (enum tree_code comp, value_range *vr, tree val,
 	  || comp == LE_EXPR)
 	return NULL_TREE;
 
-      /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
-      if (value_inside_range (val, vr->min (), vr->max ()) == 1)
+      if (!vr->contains_p (val))
 	return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
 
       return NULL_TREE;
