Remove irange::varying_p checks from symbolic_p and constant_p.

As of a few releases ago, varying_p() ranges are also constant_p.
Consequently, there is no need to check varying_p from either
symbolic_p or constant_p.

I have adjusted a few users of constant_p that were depending on
constant_p returning false for varying_p.  In these cases, I have
placed the varying_p check before the constant_p check to avoid
the more expensive constant_p check when possible.

gcc/ChangeLog:

	* gimple-ssa-evrp-analyze.c (evrp_range_analyzer::set_ssa_range_info):
	Adjust for constant_p including varying_p.
	* tree-vrp.c (vrp_prop::finalize): Same.
	(determine_value_range): Same.
	* vr-values.c (vr_values::range_of_expr): Same.
	* value-range.cc (irange::symbolic_p): Do not check varying_p.
	(irange::constant_p): Same.
This commit is contained in:
Aldy Hernandez 2021-04-17 14:26:33 +02:00
parent 778032166d
commit 694c956b6b
4 changed files with 7 additions and 12 deletions

View File

@ -109,7 +109,7 @@ evrp_range_analyzer::set_ssa_range_info (tree lhs, value_range_equiv *vr)
/* Set the SSA with the value range. */
if (INTEGRAL_TYPE_P (TREE_TYPE (lhs)))
{
if (vr->constant_p ())
if (!vr->varying_p () && vr->constant_p ())
set_range_info (lhs, vr->kind (),
wi::to_wide (vr->min ()),
wi::to_wide (vr->max ()));

View File

@ -4059,7 +4059,7 @@ vrp_prop::finalize ()
continue;
const value_range_equiv *vr = m_vr_values->get_value_range (name);
if (!name || !vr->constant_p ())
if (!name || vr->varying_p () || !vr->constant_p ())
continue;
if (POINTER_TYPE_P (TREE_TYPE (name))
@ -4679,7 +4679,7 @@ determine_value_range (tree expr, wide_int *min, wide_int *max)
{
value_range vr;
determine_value_range_1 (&vr, expr);
if (vr.constant_p ())
if (!vr.varying_p () && vr.constant_p ())
{
*min = wi::to_wide (vr.min ());
*max = wi::to_wide (vr.max ());

View File

@ -534,22 +534,17 @@ irange::equal_p (const irange &other) const
bool
irange::symbolic_p () const
{
return (!varying_p ()
&& !undefined_p ()
return (m_num_ranges > 0
&& (!is_gimple_min_invariant (min ())
|| !is_gimple_min_invariant (max ())));
}
/* NOTE: This is not the inverse of symbolic_p because the range
could also be varying or undefined. Ideally they should be inverse
of each other, with varying only applying to symbolics. Varying of
constants would be represented as [-MIN, +MAX]. */
/* Return TRUE if this is a constant range. */
bool
irange::constant_p () const
{
return (!varying_p ()
&& !undefined_p ()
return (m_num_ranges > 0
&& TREE_CODE (min ()) == INTEGER_CST
&& TREE_CODE (max ()) == INTEGER_CST);
}

View File

@ -182,7 +182,7 @@ vr_values::range_of_expr (irange &r, tree expr, gimple *stmt)
if (const value_range *vr = get_value_range (expr, stmt))
{
if (vr->undefined_p () || vr->varying_p () || vr->constant_p ())
if (vr->undefined_p () || vr->constant_p ())
r = *vr;
else
{