From fa8ba8b84cf4f1caf581b09d808d6e57b1ff2843 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Thu, 13 Jun 2019 09:46:00 +0000 Subject: [PATCH] Revamp value_range::may_contain_p. From-SVN: r272238 --- gcc/ChangeLog | 14 +++++++++++ gcc/gimple-loop-versioning.cc | 2 +- gcc/tree-vrp.c | 47 +++++++++++++---------------------- gcc/tree-vrp.h | 13 +++++++--- gcc/vr-values.c | 2 +- 5 files changed, 43 insertions(+), 35 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 08464c551db..f97ee51b523 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2019-06-13 Aldy Hernandez + + * 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 * doc/extend.texi (ARC Function Attributes): Update info. diff --git a/gcc/gimple-loop-versioning.cc b/gcc/gimple-loop-versioning.cc index 2f7cda9c8cb..fe273001423 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 065152aca3b..dc7f825efc8 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 62d72868708..4ec974f5fdb 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 &); 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 e151550d963..3f20c1a6fe8 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; -- 2.30.2