This patch cleans up the various contains, may_contain, and
value_inside_range variants we have throughout, in favor of one--
contains_p. There should be no changes in functionality.
I have added a note to range_includes_zero_p, perhaps as a personal
question than anything else. This function was/is returning true for
UNDEFINED. From a semantic sense, that doesn't make sense. UNDEFINED
is really the empty set. Is the functionality wrong, or should we call
this function something else? Either way, I'm fine removing the comment
but I'm genuinely curious.
OK?
commit eac5cbfa507146166498e395d9347efdf46d3ef4
Author: Aldy Hernandez <al...@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 <al...@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 <al...@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;