This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

implement value_range::domain_p()


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 *);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]