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:
parent
778032166d
commit
694c956b6b
|
@ -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 ()));
|
||||
|
|
|
@ -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 ());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue