Revamp value_range::may_contain_p.
authorAldy Hernandez <aldyh@redhat.com>
Thu, 13 Jun 2019 09:46:00 +0000 (09:46 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Thu, 13 Jun 2019 09:46:00 +0000 (09:46 +0000)
From-SVN: r272238

gcc/ChangeLog
gcc/gimple-loop-versioning.cc
gcc/tree-vrp.c
gcc/tree-vrp.h
gcc/vr-values.c

index 08464c551db129e3cd4cba6726acae76fbe1b341..f97ee51b5232071b8a26e45bcd8af624ede2afa5 100644 (file)
@@ -1,3 +1,17 @@
+2019-06-13  Aldy Hernandez  <aldyh@redhat.com>
+
+       * gimple-loop-versioning.cc (prune_loop_conditions): Use
+       may_contain_p.
+       * tree-vrp (value_range_base::may_contain_p): Call into
+       value_inside_range.
+       (value_inside_range): Make private inside value_range_base class.
+       Take min/max from *this.
+       (range_includes_p): Remove.
+       * tree-vrp.h (value_range_base): Add value_inside_range.
+       (range_includes_p): Remove.
+       (range_includes_zero_p): Call may_contain_p.
+       * vr-values.c (compare_range_with_value): Same.
+
 2019-06-13  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * doc/extend.texi (ARC Function Attributes): Update info.
index 2f7cda9c8cb6b2ee5cfcf0ce134bd673d69f50c4..fe2730014234ce15e8ee0bb011b69269d04c62cf 100644 (file)
@@ -1488,7 +1488,7 @@ 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->may_contain_p (build_one_cst (TREE_TYPE (name))))
        {
          if (dump_enabled_p ())
            dump_printf_loc (MSG_NOTE, find_loop_location (loop),
index 065152aca3b83a4a42e74c5a5ef2005a1be88bcb..dc7f825efc89da72b085d97d7e201854ddcda0f8 100644 (file)
@@ -287,18 +287,7 @@ value_range::set_varying ()
 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;
+  return value_inside_range (val) != 0;
 }
 
 void
@@ -1118,40 +1107,38 @@ compare_values (tree val1, tree val2)
 }
 
 
-/* Return 1 if VAL is inside value range MIN <= VAL <= MAX,
-          0 if VAL is not inside [MIN, MAX],
+/* Return 1 if VAL is inside value range.
+          0 if VAL is not inside value range.
         -2 if we cannot tell either way.
 
    Benchmark compile/20001226-1.c compilation time after changing this
    function.  */
 
 int
-value_inside_range (tree val, tree min, tree max)
+value_range_base::value_inside_range (tree val) const
 {
   int cmp1, cmp2;
 
-  cmp1 = operand_less_p (val, min);
+  if (varying_p ())
+    return 1;
+
+  if (undefined_p ())
+    return 0;
+
+  cmp1 = operand_less_p (val, m_min);
   if (cmp1 == -2)
     return -2;
   if (cmp1 == 1)
-    return 0;
+    return m_kind != VR_RANGE;
 
-  cmp2 = operand_less_p (max, val);
+  cmp2 = operand_less_p (m_max, val);
   if (cmp2 == -2)
     return -2;
 
-  return !cmp2;
-}
-
-
-/* Return TRUE if *VR includes the value X.  */
-
-bool
-range_includes_p (const value_range_base *vr, HOST_WIDE_INT x)
-{
-  if (vr->varying_p () || vr->undefined_p ())
-    return true;
-  return vr->may_contain_p (build_int_cst (vr->type (), x));
+  if (m_kind == VR_RANGE)
+    return !cmp2;
+  else
+    return !!cmp2;
 }
 
 /* Value range wrapper for wide_int_range_set_zero_nonzero_bits.
index 62d72868708fb00b0cc1c8448f8fec1811897fda..4ec974f5fdb1b6dbd57e8e3a7aae687e31f0a338 100644 (file)
@@ -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) 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,13 @@ 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);
+  if (vr->undefined_p ())
+    return false;
+
+  if (vr->varying_p ())
+    return true;
+
+  return vr->may_contain_p (build_zero_cst (vr->type ()));
 }
 
 #endif /* GCC_TREE_VRP_H */
index e151550d963142e5237358aee967965c94ead0ac..3f20c1a6fe870a871e39f9b30460d38a1cab0efe 100644 (file)
@@ -1625,7 +1625,7 @@ compare_range_with_value (enum tree_code comp, value_range *vr, tree val,
        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->may_contain_p (val))
        return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
 
       return NULL_TREE;