aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2019-06-13 09:46:00 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2019-06-13 09:46:00 +0000
commitfa8ba8b84cf4f1caf581b09d808d6e57b1ff2843 (patch)
tree974fdf46b52abb2f7b4de4981329e8f625215904 /gcc
parenta7b183bf22c7c57fc0d8851f84db6fff694ba5f8 (diff)
downloadgcc-fa8ba8b84cf4f1caf581b09d808d6e57b1ff2843.zip
gcc-fa8ba8b84cf4f1caf581b09d808d6e57b1ff2843.tar.gz
gcc-fa8ba8b84cf4f1caf581b09d808d6e57b1ff2843.tar.bz2
Revamp value_range::may_contain_p.
From-SVN: r272238
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/gimple-loop-versioning.cc2
-rw-r--r--gcc/tree-vrp.c47
-rw-r--r--gcc/tree-vrp.h13
-rw-r--r--gcc/vr-values.c2
5 files changed, 43 insertions, 35 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 08464c5..f97ee51 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/gimple-loop-versioning.cc b/gcc/gimple-loop-versioning.cc
index 2f7cda9..fe27300 100644
--- a/gcc/gimple-loop-versioning.cc
+++ b/gcc/gimple-loop-versioning.cc
@@ -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),
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 065152a..dc7f825 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -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.
diff --git a/gcc/tree-vrp.h b/gcc/tree-vrp.h
index 62d7286..4ec974f 100644
--- a/gcc/tree-vrp.h
+++ b/gcc/tree-vrp.h
@@ -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 */
diff --git a/gcc/vr-values.c b/gcc/vr-values.c
index e151550..3f20c1a 100644
--- a/gcc/vr-values.c
+++ b/gcc/vr-values.c
@@ -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;