Commit e5a3f08f by Aldy Hernandez Committed by Aldy Hernandez

gimple-ssa-evrp-analyze.c (set_ssa_range_info): Pass value_range to range_includes_zero_p.

	* gimple-ssa-evrp-analyze.c (set_ssa_range_info): Pass value_range
	to range_includes_zero_p.  Do not special case VR_ANTI_RANGE.
	* tree-vrp.c (range_is_nonnull): Remove.
	(range_includes_zero_p): Accept value_range instead of min/max.
	(extract_range_from_binary_expr_1): Do not early bail on
	POINTER_PLUS_EXPR.
	Use range_includes_zero_p instead of range_is_nonnull.
	(extract_range_from_unary_expr): Use range_includes_zero_p instead
	of range_is_nonnull.
	(vrp_meet_1): Pass value_range to range_includes_zero_p.  Do not
	special case VR_ANTI_RANGE.
	(vrp_finalize): Same.
	* tree-vrp.h (range_includes_zero_p): Pass value_range as argument
	instead of min/max.
	(range_is_nonnull): Remove.
	* vr-values.c (vrp_stmt_computes_nonzero): Use
	range_includes_zero_p instead of range_is_nonnull.
	(extract_range_basic): Pass value_range to range_includes_zero_p
	instead of range_is_nonnull.

From-SVN: r263842
parent 6eac0600
2018-08-24 Aldy Hernandez <aldyh@redhat.com>
* gimple-ssa-evrp-analyze.c (set_ssa_range_info): Pass value_range
to range_includes_zero_p. Do not special case VR_ANTI_RANGE.
* tree-vrp.c (range_is_nonnull): Remove.
(range_includes_zero_p): Accept value_range instead of min/max.
(extract_range_from_binary_expr_1): Do not early bail on
POINTER_PLUS_EXPR.
Use range_includes_zero_p instead of range_is_nonnull.
(extract_range_from_unary_expr): Use range_includes_zero_p instead
of range_is_nonnull.
(vrp_meet_1): Pass value_range to range_includes_zero_p. Do not
special case VR_ANTI_RANGE.
(vrp_finalize): Same.
* tree-vrp.h (range_includes_zero_p): Pass value_range as argument
instead of min/max.
(range_is_nonnull): Remove.
* vr-values.c (vrp_stmt_computes_nonzero): Use
range_includes_zero_p instead of range_is_nonnull.
(extract_range_basic): Pass value_range to range_includes_zero_p
instead of range_is_nonnull.
2018-08-24 Uros Bizjak <ubizjak@gmail.com> 2018-08-24 Uros Bizjak <ubizjak@gmail.com>
* emit-rtl.c (init_emit_once): Do not emit MODE_POINTER_BOUNDS RTXes. * emit-rtl.c (init_emit_once): Do not emit MODE_POINTER_BOUNDS RTXes.
......
...@@ -119,12 +119,7 @@ evrp_range_analyzer::set_ssa_range_info (tree lhs, value_range *vr) ...@@ -119,12 +119,7 @@ evrp_range_analyzer::set_ssa_range_info (tree lhs, value_range *vr)
wi::to_wide (vr->max)); wi::to_wide (vr->max));
} }
else if (POINTER_TYPE_P (TREE_TYPE (lhs)) else if (POINTER_TYPE_P (TREE_TYPE (lhs))
&& ((vr->type == VR_RANGE && range_includes_zero_p (vr) == 0)
&& range_includes_zero_p (vr->min,
vr->max) == 0)
|| (vr->type == VR_ANTI_RANGE
&& range_includes_zero_p (vr->min,
vr->max) == 1)))
set_ptr_nonnull (lhs); set_ptr_nonnull (lhs);
} }
......
...@@ -502,17 +502,6 @@ vrp_bitmap_equal_p (const_bitmap b1, const_bitmap b2) ...@@ -502,17 +502,6 @@ vrp_bitmap_equal_p (const_bitmap b1, const_bitmap b2)
&& bitmap_equal_p (b1, b2))); && bitmap_equal_p (b1, b2)));
} }
/* Return true if VR is ~[0, 0]. */
bool
range_is_nonnull (value_range *vr)
{
return vr->type == VR_ANTI_RANGE
&& integer_zerop (vr->min)
&& integer_zerop (vr->max);
}
/* Return true if VR is [0, 0]. */ /* Return true if VR is [0, 0]. */
static inline bool static inline bool
...@@ -880,14 +869,25 @@ value_ranges_intersect_p (value_range *vr0, value_range *vr1) ...@@ -880,14 +869,25 @@ value_ranges_intersect_p (value_range *vr0, value_range *vr1)
} }
/* Return 1 if [MIN, MAX] includes the value zero, 0 if it does not /* Return TRUE if *VR includes the value zero. */
include the value zero, -2 if we cannot tell. */
int bool
range_includes_zero_p (tree min, tree max) range_includes_zero_p (const value_range *vr)
{ {
tree zero = build_int_cst (TREE_TYPE (min), 0); if (vr->type == VR_VARYING)
return value_inside_range (zero, min, max); return true;
/* Ughh, we don't know. We choose not to optimize. */
if (vr->type == VR_UNDEFINED)
return true;
tree zero = build_int_cst (TREE_TYPE (vr->min), 0);
if (vr->type == VR_ANTI_RANGE)
{
int res = value_inside_range (zero, vr->min, vr->max);
return res == 0 || res == -2;
}
return value_inside_range (zero, vr->min, vr->max) != 0;
} }
/* Return true if *VR is know to only contain nonnegative values. */ /* Return true if *VR is know to only contain nonnegative values. */
...@@ -1424,7 +1424,7 @@ extract_range_from_binary_expr_1 (value_range *vr, ...@@ -1424,7 +1424,7 @@ extract_range_from_binary_expr_1 (value_range *vr,
nullness, if both are non null, then the result is nonnull. nullness, if both are non null, then the result is nonnull.
If both are null, then the result is null. Otherwise they If both are null, then the result is null. Otherwise they
are varying. */ are varying. */
if (range_is_nonnull (&vr0) && range_is_nonnull (&vr1)) if (!range_includes_zero_p (&vr0) && !range_includes_zero_p (&vr1))
set_value_range_to_nonnull (vr, expr_type); set_value_range_to_nonnull (vr, expr_type);
else if (range_is_null (&vr0) && range_is_null (&vr1)) else if (range_is_null (&vr0) && range_is_null (&vr1))
set_value_range_to_null (vr, expr_type); set_value_range_to_null (vr, expr_type);
...@@ -1435,11 +1435,8 @@ extract_range_from_binary_expr_1 (value_range *vr, ...@@ -1435,11 +1435,8 @@ extract_range_from_binary_expr_1 (value_range *vr,
{ {
/* For pointer types, we are really only interested in asserting /* For pointer types, we are really only interested in asserting
whether the expression evaluates to non-NULL. */ whether the expression evaluates to non-NULL. */
if (range_is_nonnull (&vr0) if (!range_includes_zero_p (&vr0)
|| range_is_nonnull (&vr1) || !range_includes_zero_p (&vr1))
|| (vr1.type == VR_RANGE
&& !symbolic_range_p (&vr1)
&& !range_includes_zero_p (vr1.min, vr1.max)))
set_value_range_to_nonnull (vr, expr_type); set_value_range_to_nonnull (vr, expr_type);
else if (range_is_null (&vr0) && range_is_null (&vr1)) else if (range_is_null (&vr0) && range_is_null (&vr1))
set_value_range_to_null (vr, expr_type); set_value_range_to_null (vr, expr_type);
...@@ -1450,7 +1447,7 @@ extract_range_from_binary_expr_1 (value_range *vr, ...@@ -1450,7 +1447,7 @@ extract_range_from_binary_expr_1 (value_range *vr,
{ {
/* For pointer types, we are really only interested in asserting /* For pointer types, we are really only interested in asserting
whether the expression evaluates to non-NULL. */ whether the expression evaluates to non-NULL. */
if (range_is_nonnull (&vr0) && range_is_nonnull (&vr1)) if (!range_includes_zero_p (&vr0) && !range_includes_zero_p (&vr1))
set_value_range_to_nonnull (vr, expr_type); set_value_range_to_nonnull (vr, expr_type);
else if (range_is_null (&vr0) || range_is_null (&vr1)) else if (range_is_null (&vr0) || range_is_null (&vr1))
set_value_range_to_null (vr, expr_type); set_value_range_to_null (vr, expr_type);
...@@ -1888,7 +1885,7 @@ extract_range_from_unary_expr (value_range *vr, ...@@ -1888,7 +1885,7 @@ extract_range_from_unary_expr (value_range *vr,
determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]). */ determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]). */
if (POINTER_TYPE_P (type)) if (POINTER_TYPE_P (type))
{ {
if (range_is_nonnull (&vr0)) if (!range_includes_zero_p (&vr0))
set_value_range_to_nonnull (vr, type); set_value_range_to_nonnull (vr, type);
else if (range_is_null (&vr0)) else if (range_is_null (&vr0))
set_value_range_to_null (vr, type); set_value_range_to_null (vr, type);
...@@ -6020,17 +6017,9 @@ vrp_meet_1 (value_range *vr0, const value_range *vr1) ...@@ -6020,17 +6017,9 @@ vrp_meet_1 (value_range *vr0, const value_range *vr1)
{ {
/* Failed to find an efficient meet. Before giving up and setting /* Failed to find an efficient meet. Before giving up and setting
the result to VARYING, see if we can at least derive a useful the result to VARYING, see if we can at least derive a useful
anti-range. FIXME, all this nonsense about distinguishing anti-range. */
anti-ranges from ranges is necessary because of the odd if (range_includes_zero_p (&saved) == 0
semantics of range_includes_zero_p and friends. */ && range_includes_zero_p (vr1) == 0)
if (((saved.type == VR_RANGE
&& range_includes_zero_p (saved.min, saved.max) == 0)
|| (saved.type == VR_ANTI_RANGE
&& range_includes_zero_p (saved.min, saved.max) == 1))
&& ((vr1->type == VR_RANGE
&& range_includes_zero_p (vr1->min, vr1->max) == 0)
|| (vr1->type == VR_ANTI_RANGE
&& range_includes_zero_p (vr1->min, vr1->max) == 1)))
{ {
set_value_range_to_nonnull (vr0, TREE_TYPE (saved.min)); set_value_range_to_nonnull (vr0, TREE_TYPE (saved.min));
...@@ -6540,10 +6529,7 @@ vrp_prop::vrp_finalize (bool warn_array_bounds_p) ...@@ -6540,10 +6529,7 @@ vrp_prop::vrp_finalize (bool warn_array_bounds_p)
continue; continue;
if (POINTER_TYPE_P (TREE_TYPE (name)) if (POINTER_TYPE_P (TREE_TYPE (name))
&& ((vr->type == VR_RANGE && range_includes_zero_p (vr) == 0)
&& range_includes_zero_p (vr->min, vr->max) == 0)
|| (vr->type == VR_ANTI_RANGE
&& range_includes_zero_p (vr->min, vr->max) == 1)))
set_ptr_nonnull (name); set_ptr_nonnull (name);
else if (!POINTER_TYPE_P (TREE_TYPE (name))) else if (!POINTER_TYPE_P (TREE_TYPE (name)))
set_range_info (name, vr->type, set_range_info (name, vr->type,
......
...@@ -86,7 +86,7 @@ extern void register_edge_assert_for (tree, edge, enum tree_code, ...@@ -86,7 +86,7 @@ extern void register_edge_assert_for (tree, edge, enum tree_code,
tree, tree, vec<assert_info> &); tree, tree, vec<assert_info> &);
extern bool stmt_interesting_for_vrp (gimple *); extern bool stmt_interesting_for_vrp (gimple *);
extern void set_value_range_to_varying (value_range *); extern void set_value_range_to_varying (value_range *);
extern int range_includes_zero_p (tree, tree); extern bool range_includes_zero_p (const value_range *);
extern bool infer_value_range (gimple *, tree, tree_code *, tree *); extern bool infer_value_range (gimple *, tree, tree_code *, tree *);
extern void set_value_range_to_nonnull (value_range *, tree); extern void set_value_range_to_nonnull (value_range *, tree);
...@@ -96,7 +96,6 @@ extern void set_and_canonicalize_value_range (value_range *, ...@@ -96,7 +96,6 @@ extern void set_and_canonicalize_value_range (value_range *,
enum value_range_type, enum value_range_type,
tree, tree, bitmap); tree, tree, bitmap);
extern bool vrp_bitmap_equal_p (const_bitmap, const_bitmap); extern bool vrp_bitmap_equal_p (const_bitmap, const_bitmap);
extern bool range_is_nonnull (value_range *);
extern tree value_range_constant_singleton (value_range *); extern tree value_range_constant_singleton (value_range *);
extern bool symbolic_range_p (value_range *); extern bool symbolic_range_p (value_range *);
extern int compare_values (tree, tree); extern int compare_values (tree, tree);
......
...@@ -343,7 +343,7 @@ vr_values::vrp_stmt_computes_nonzero (gimple *stmt) ...@@ -343,7 +343,7 @@ vr_values::vrp_stmt_computes_nonzero (gimple *stmt)
&& TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME) && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
{ {
value_range *vr = get_value_range (TREE_OPERAND (base, 0)); value_range *vr = get_value_range (TREE_OPERAND (base, 0));
if (range_is_nonnull (vr)) if (!range_includes_zero_p (vr))
return true; return true;
} }
} }
...@@ -1107,12 +1107,8 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt) ...@@ -1107,12 +1107,8 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt)
if (TREE_CODE (arg) == SSA_NAME) if (TREE_CODE (arg) == SSA_NAME)
{ {
value_range *vr0 = get_value_range (arg); value_range *vr0 = get_value_range (arg);
/* If arg is non-zero, then ffs or popcount /* If arg is non-zero, then ffs or popcount are non-zero. */
are non-zero. */ if (range_includes_zero_p (vr0) == 0)
if ((vr0->type == VR_RANGE
&& range_includes_zero_p (vr0->min, vr0->max) == 0)
|| (vr0->type == VR_ANTI_RANGE
&& range_includes_zero_p (vr0->min, vr0->max) == 1))
mini = 1; mini = 1;
/* If some high bits are known to be zero, /* If some high bits are known to be zero,
we can decrease the maximum. */ we can decrease the maximum. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment