Commit c89af696 by Aldy Hernandez Committed by Aldy Hernandez

gimple-fold.c (size_must_be_zero_p): Use value_range API instead of performing ad-hoc calculations.

	* gimple-fold.c (size_must_be_zero_p): Use value_range API instead
	of performing ad-hoc calculations.
	* tree-ssanames.c (set_range_info): New overloaded function
	accepting value_range &.
	(get_range_info): Same.
	* tree-ssanames.h (set_range_info_raw): Remove.
	(set_range_info): New prototype.
	(get_range_info): Same.
	* tree-vrp.h (value_range::null_p): Rename to zero_p.
	* tree-vrp.c (value_range::null_p): Same.

From-SVN: r265952
parent 15e109b3
2018-11-08 Aldy Hernandez <aldyh@redhat.com>
* gimple-fold.c (size_must_be_zero_p): Use value_range API instead
of performing ad-hoc calculations.
* tree-ssanames.c (set_range_info): New overloaded function
accepting value_range &.
(get_range_info): Same.
* tree-ssanames.h (set_range_info_raw): Remove.
(set_range_info): New prototype.
(get_range_info): Same.
* tree-vrp.h (value_range::null_p): Rename to zero_p.
* tree-vrp.c (value_range::null_p): Same.
2018-11-09 Jan Hubicka <jh@suse.cz> 2018-11-09 Jan Hubicka <jh@suse.cz>
* tree.c (fld_type_variant_equal_p): Test user align flag. * tree.c (fld_type_variant_equal_p): Test user align flag.
...@@ -635,9 +635,8 @@ var_decl_component_p (tree var) ...@@ -635,9 +635,8 @@ var_decl_component_p (tree var)
&& TREE_CODE (TREE_OPERAND (inner, 0)) == ADDR_EXPR)); && TREE_CODE (TREE_OPERAND (inner, 0)) == ADDR_EXPR));
} }
/* If the SIZE argument representing the size of an object is in a range /* Return TRUE if the SIZE argument, representing the size of an
of values of which exactly one is valid (and that is zero), return object, is in a range of values of which exactly zero is valid. */
true, otherwise false. */
static bool static bool
size_must_be_zero_p (tree size) size_must_be_zero_p (tree size)
...@@ -648,21 +647,19 @@ size_must_be_zero_p (tree size) ...@@ -648,21 +647,19 @@ size_must_be_zero_p (tree size)
if (TREE_CODE (size) != SSA_NAME || !INTEGRAL_TYPE_P (TREE_TYPE (size))) if (TREE_CODE (size) != SSA_NAME || !INTEGRAL_TYPE_P (TREE_TYPE (size)))
return false; return false;
wide_int min, max;
enum value_range_kind rtype = get_range_info (size, &min, &max);
if (rtype != VR_ANTI_RANGE)
return false;
tree type = TREE_TYPE (size); tree type = TREE_TYPE (size);
int prec = TYPE_PRECISION (type); int prec = TYPE_PRECISION (type);
wide_int wone = wi::one (prec);
/* Compute the value of SSIZE_MAX, the largest positive value that /* Compute the value of SSIZE_MAX, the largest positive value that
can be stored in ssize_t, the signed counterpart of size_t. */ can be stored in ssize_t, the signed counterpart of size_t. */
wide_int ssize_max = wi::lshift (wi::one (prec), prec - 1) - 1; wide_int ssize_max = wi::lshift (wi::one (prec), prec - 1) - 1;
value_range valid_range (VR_RANGE,
return wi::eq_p (min, wone) && wi::geu_p (max, ssize_max); build_int_cst (type, 0),
wide_int_to_tree (type, ssize_max));
value_range vr;
get_range_info (size, vr);
vr.intersect (&valid_range);
return vr.zero_p ();
} }
/* Fold function call to builtin mem{{,p}cpy,move}. Try to detect and /* Fold function call to builtin mem{{,p}cpy,move}. Try to detect and
......
...@@ -398,6 +398,15 @@ set_range_info (tree name, enum value_range_kind range_type, ...@@ -398,6 +398,15 @@ set_range_info (tree name, enum value_range_kind range_type,
set_range_info_raw (name, range_type, min, max); set_range_info_raw (name, range_type, min, max);
} }
/* Store range information for NAME from a value_range. */
void
set_range_info (tree name, const value_range &vr)
{
wide_int min = wi::to_wide (vr.min ());
wide_int max = wi::to_wide (vr.max ());
set_range_info (name, vr.kind (), min, max);
}
/* Gets range information MIN, MAX and returns enum value_range_kind /* Gets range information MIN, MAX and returns enum value_range_kind
corresponding to tree ssa_name NAME. enum value_range_kind returned corresponding to tree ssa_name NAME. enum value_range_kind returned
...@@ -421,6 +430,27 @@ get_range_info (const_tree name, wide_int *min, wide_int *max) ...@@ -421,6 +430,27 @@ get_range_info (const_tree name, wide_int *min, wide_int *max)
return SSA_NAME_RANGE_TYPE (name); return SSA_NAME_RANGE_TYPE (name);
} }
/* Gets range information corresponding to ssa_name NAME and stores it
in a value_range VR. Returns the value_range_kind. */
enum value_range_kind
get_range_info (const_tree name, value_range &vr)
{
tree min, max;
wide_int wmin, wmax;
enum value_range_kind kind = get_range_info (name, &wmin, &wmax);
if (kind == VR_VARYING || kind == VR_UNDEFINED)
min = max = NULL;
else
{
min = wide_int_to_tree (TREE_TYPE (name), wmin);
max = wide_int_to_tree (TREE_TYPE (name), wmax);
}
vr = value_range (kind, min, max);
return kind;
}
/* Set nonnull attribute to pointer NAME. */ /* Set nonnull attribute to pointer NAME. */
void void
......
...@@ -69,12 +69,11 @@ struct GTY ((variable_size)) range_info_def { ...@@ -69,12 +69,11 @@ struct GTY ((variable_size)) range_info_def {
/* Sets the value range to SSA. */ /* Sets the value range to SSA. */
extern void set_range_info (tree, enum value_range_kind, const wide_int_ref &, extern void set_range_info (tree, enum value_range_kind, const wide_int_ref &,
const wide_int_ref &); const wide_int_ref &);
extern void set_range_info_raw (tree, enum value_range_kind, extern void set_range_info (tree, const value_range &);
const wide_int_ref &,
const wide_int_ref &);
/* Gets the value range from SSA. */ /* Gets the value range from SSA. */
extern enum value_range_kind get_range_info (const_tree, wide_int *, extern enum value_range_kind get_range_info (const_tree, wide_int *,
wide_int *); wide_int *);
extern enum value_range_kind get_range_info (const_tree, value_range &);
extern void set_nonzero_bits (tree, const wide_int_ref &); extern void set_nonzero_bits (tree, const wide_int_ref &);
extern wide_int get_nonzero_bits (const_tree); extern wide_int get_nonzero_bits (const_tree);
extern bool ssa_name_has_boolean_range (tree); extern bool ssa_name_has_boolean_range (tree);
......
...@@ -743,7 +743,7 @@ vrp_bitmap_equal_p (const_bitmap b1, const_bitmap b2) ...@@ -743,7 +743,7 @@ vrp_bitmap_equal_p (const_bitmap b1, const_bitmap b2)
static inline bool static inline bool
range_is_null (const value_range *vr) range_is_null (const value_range *vr)
{ {
return vr->null_p (); return vr->zero_p ();
} }
static inline bool static inline bool
......
...@@ -63,7 +63,7 @@ class GTY((for_user)) value_range ...@@ -63,7 +63,7 @@ class GTY((for_user)) value_range
/* Misc methods. */ /* Misc methods. */
tree type () const; tree type () const;
bool null_p () const; bool zero_p () const;
bool may_contain_p (tree) const; bool may_contain_p (tree) const;
bool singleton_p (tree *result = NULL) const; bool singleton_p (tree *result = NULL) const;
void deep_copy (const value_range *); void deep_copy (const value_range *);
...@@ -150,7 +150,7 @@ value_range::undefined_p () const ...@@ -150,7 +150,7 @@ value_range::undefined_p () const
/* Return TRUE if range is the constant zero. */ /* Return TRUE if range is the constant zero. */
inline bool inline bool
value_range::null_p () const value_range::zero_p () const
{ {
return (m_kind == VR_RANGE return (m_kind == VR_RANGE
&& integer_zerop (m_min) && integer_zerop (m_min)
......
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