I believe I've seen this idiom more than once. I know for sure I've
used it in our ssa-range branch :). I'll hunt for the other uses and
adjust accordingly.
OK?
* tree-vrp.h (value_range::domain_p): New.
* tree-vrp.c (value_range::domain_p): New.
* tree-ssa-strlen.c (strlen_check_and_optimize_stmt): Use
value_range::domain_p instead of doing things ad-hoc.
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 669c315dce2..ddb61e5a7f3 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -3687,19 +3687,16 @@ strlen_check_and_optimize_stmt (gimple_stmt_iterator *gsi, bool *cleanup_eh)
/* Reading a character before the final '\0'
character. Just set the value range to ~[0, 0]
if we don't have anything better. */
- wide_int min, max;
+ value_range vr;
+ get_range_info (lhs, vr);
tree type = TREE_TYPE (lhs);
- enum value_range_kind vr
- = get_range_info (lhs, &min, &max);
- if (vr == VR_VARYING
- || (vr == VR_RANGE
- && min == wi::min_value (TYPE_PRECISION (type),
- TYPE_SIGN (type))
- && max == wi::max_value (TYPE_PRECISION (type),
- TYPE_SIGN (type))))
- set_range_info (lhs, VR_ANTI_RANGE,
- wi::zero (TYPE_PRECISION (type)),
- wi::zero (TYPE_PRECISION (type)));
+ if (vr.domain_p ())
+ {
+ value_range vr (VR_ANTI_RANGE,
+ build_int_cst (type, 0),
+ build_int_cst (type, 0));
+ set_range_info (lhs, vr);
+ }
}
}
}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 3ccf2e491d6..e2126c21974 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -178,6 +178,22 @@ value_range::equal_p (const value_range &other, bool ignore_equivs) const
|| vrp_bitmap_equal_p (m_equiv, other.m_equiv)));
}
+/* Return TRUE if value_range spans the entire domain. */
+
+bool
+value_range::domain_p () const
+{
+ if (varying_p ())
+ return true;
+ if (m_kind == VR_RANGE)
+ {
+ tree type = TREE_TYPE (type ());
+ value_range vr (VR_RANGE, TYPE_MIN_VALUE (type), TYPE_MAX_VALUE (type));
+ return equal_p (vr, /*ignore_equivs=*/true);
+ }
+ return false;
+}
+
/* Return equality while ignoring equivalence bitmap. */
bool
diff --git a/gcc/tree-vrp.h b/gcc/tree-vrp.h
index c251329a195..c5811d50bbf 100644
--- a/gcc/tree-vrp.h
+++ b/gcc/tree-vrp.h
@@ -64,6 +64,7 @@ class GTY((for_user)) value_range
/* Misc methods. */
tree type () const;
bool null_p () const;
+ bool domain_p () const;
bool may_contain_p (tree) const;
bool singleton_p (tree *result = NULL) const;
void deep_copy (const value_range *);