Remove range_int_cst_p.

gcc/ChangeLog:

	* tree-data-ref.cc (compute_distributive_range): Replace uses of
	range_int_cst_p with irange API.
	* tree-ssa-strlen.cc (get_range_strlen_dynamic): Same.
	* tree-vrp.h (range_int_cst_p): Delete.
	* vr-values.cc (check_for_binary_op_overflow): Replace usees of
	range_int_cst_p with irange API.
	(vr_set_zero_nonzero_bits): Same.
	(range_fits_type_p): Same.
	(simplify_using_ranges::simplify_casted_cond): Same.
	* tree-vrp.cc (range_int_cst_p): Remove.
This commit is contained in:
Aldy Hernandez 2022-12-21 13:06:23 +01:00
parent fb5607ae6a
commit ebef388ec3
5 changed files with 49 additions and 54 deletions

View file

@ -646,7 +646,8 @@ compute_distributive_range (tree type, value_range &op0_range,
if (!op.fold_range (wide_range, ssizetype, op0_range, op1_range))
wide_range.set_varying (ssizetype);;
flag_wrapv = saved_flag_wrapv;
if (wide_range.num_pairs () != 1 || !range_int_cst_p (&wide_range))
if (wide_range.num_pairs () != 1
|| wide_range.varying_p () || wide_range.undefined_p ())
return false;
wide_int lb = wide_range.lower_bound ();

View file

@ -1222,13 +1222,14 @@ get_range_strlen_dynamic (tree src, gimple *stmt,
{
value_range vr;
ptr_qry->rvals->range_of_expr (vr, si->nonzero_chars, si->stmt);
if (range_int_cst_p (&vr))
{
pdata->minlen = vr.min ();
pdata->maxlen = vr.max ();
}
else
if (vr.undefined_p () || vr.varying_p ())
pdata->minlen = build_zero_cst (size_type_node);
else
{
tree type = vr.type ();
pdata->minlen = wide_int_to_tree (type, vr.lower_bound ());
pdata->maxlen = wide_int_to_tree (type, vr.upper_bound ());
}
}
else
pdata->minlen = build_zero_cst (size_type_node);
@ -1266,21 +1267,22 @@ get_range_strlen_dynamic (tree src, gimple *stmt,
{
value_range vr;
ptr_qry->rvals->range_of_expr (vr, si->nonzero_chars, stmt);
if (range_int_cst_p (&vr))
if (vr.varying_p () || vr.undefined_p ())
{
pdata->minlen = vr.min ();
pdata->maxlen = vr.max ();
pdata->minlen = build_zero_cst (size_type_node);
pdata->maxlen = build_all_ones_cst (size_type_node);
}
else
{
tree type = vr.type ();
pdata->minlen = wide_int_to_tree (type, vr.lower_bound ());
pdata->maxlen = wide_int_to_tree (type, vr.upper_bound ());
offset_int max = offset_int::from (vr.upper_bound (0), SIGNED);
if (tree maxbound = get_maxbound (si->ptr, stmt, max, ptr_qry))
pdata->maxbound = maxbound;
else
pdata->maxbound = pdata->maxlen;
}
else
{
pdata->minlen = build_zero_cst (size_type_node);
pdata->maxlen = build_all_ones_cst (size_type_node);
}
}
else if (pdata->minlen && TREE_CODE (pdata->minlen) == INTEGER_CST)
{

View file

@ -312,15 +312,6 @@ intersect_range_with_nonzero_bits (enum value_range_kind vr_type,
return vr_type;
}
/* Return true if max and min of VR are INTEGER_CST. It's not necessary
a singleton. */
bool
range_int_cst_p (const value_range *vr)
{
return (vr->kind () == VR_RANGE && range_has_numeric_bounds_p (vr));
}
/* Return the single symbol (an SSA_NAME) contained in T if any, or NULL_TREE
otherwise. We only handle additive operations and set NEG to true if the
symbol is negated and INV to the invariant part, if any. */

View file

@ -22,8 +22,6 @@ along with GCC; see the file COPYING3. If not see
#include "value-range.h"
extern bool range_int_cst_p (const value_range *);
extern int compare_values (tree, tree);
extern int compare_values_warnv (tree, tree, bool *);
extern int operand_less_p (tree, tree);

View file

@ -125,16 +125,16 @@ check_for_binary_op_overflow (range_query *query,
vr1.set_varying (TREE_TYPE (op1));
tree vr0min, vr0max, vr1min, vr1max;
get_legacy_range (vr0, vr0min, vr0max);
get_legacy_range (vr1, vr1min, vr1max);
if (!range_int_cst_p (&vr0)
value_range_kind kind0 = get_legacy_range (vr0, vr0min, vr0max);
value_range_kind kind1 = get_legacy_range (vr1, vr1min, vr1max);
if (kind0 != VR_RANGE
|| TREE_OVERFLOW (vr0min)
|| TREE_OVERFLOW (vr0max))
{
vr0min = vrp_val_min (TREE_TYPE (op0));
vr0max = vrp_val_max (TREE_TYPE (op0));
}
if (!range_int_cst_p (&vr1)
if (kind1 != VR_RANGE
|| TREE_OVERFLOW (vr1min)
|| TREE_OVERFLOW (vr1max))
{
@ -1000,10 +1000,11 @@ simplify_using_ranges::simplify_div_or_mod_using_ranges
{
if (!query->range_of_expr (vr, op0, stmt))
vr.set_varying (TREE_TYPE (op0));
if (range_int_cst_p (&vr))
if (!vr.varying_p () && !vr.undefined_p ())
{
op0min = vr.min ();
op0max = vr.max ();
tree type = vr.type ();
op0min = wide_int_to_tree (type, vr.lower_bound ());
op0max = wide_int_to_tree (type, vr.upper_bound ());
}
}
@ -1013,8 +1014,8 @@ simplify_using_ranges::simplify_div_or_mod_using_ranges
value_range vr1;
if (!query->range_of_expr (vr1, op1, stmt))
vr1.set_varying (TREE_TYPE (op1));
if (range_int_cst_p (&vr1))
op1min = vr1.min ();
if (!vr1.varying_p () && !vr1.undefined_p ())
op1min = wide_int_to_tree (vr1.type (), vr1.lower_bound ());
}
if (rhs_code == TRUNC_MOD_EXPR
&& TREE_CODE (op1min) == INTEGER_CST
@ -1217,21 +1218,19 @@ simplify_using_ranges::simplify_abs_using_ranges (gimple_stmt_iterator *gsi,
static bool
vr_set_zero_nonzero_bits (const tree expr_type,
const value_range *vr,
const irange *vr,
wide_int *may_be_nonzero,
wide_int *must_be_nonzero)
{
if (range_int_cst_p (vr))
if (vr->varying_p () || vr->undefined_p ())
{
wi_set_zero_nonzero_bits (expr_type,
wi::to_wide (vr->min ()),
wi::to_wide (vr->max ()),
*may_be_nonzero, *must_be_nonzero);
return true;
*may_be_nonzero = wi::minus_one (TYPE_PRECISION (expr_type));
*must_be_nonzero = wi::zero (TYPE_PRECISION (expr_type));
return false;
}
*may_be_nonzero = wi::minus_one (TYPE_PRECISION (expr_type));
*must_be_nonzero = wi::zero (TYPE_PRECISION (expr_type));
return false;
wi_set_zero_nonzero_bits (expr_type, vr->lower_bound (), vr->upper_bound (),
*may_be_nonzero, *must_be_nonzero);
return true;
}
/* Optimize away redundant BIT_AND_EXPR and BIT_IOR_EXPR.
@ -1418,7 +1417,9 @@ range_fits_type_p (const value_range *vr,
return true;
/* Now we can only handle ranges with constant bounds. */
if (!range_int_cst_p (vr))
tree vrmin, vrmax;
value_range_kind kind = get_legacy_range (*vr, vrmin, vrmax);
if (kind != VR_RANGE)
return false;
/* For sign changes, the MSB of the wide_int has to be clear.
@ -1426,17 +1427,17 @@ range_fits_type_p (const value_range *vr,
a signed wide_int, while a negative value cannot be represented
by an unsigned wide_int. */
if (src_sgn != dest_sgn
&& (wi::lts_p (wi::to_wide (vr->min ()), 0)
|| wi::lts_p (wi::to_wide (vr->max ()), 0)))
&& (wi::lts_p (wi::to_wide (vrmin), 0)
|| wi::lts_p (wi::to_wide (vrmax), 0)))
return false;
/* Then we can perform the conversion on both ends and compare
the result for equality. */
tem = wi::ext (wi::to_widest (vr->min ()), dest_precision, dest_sgn);
if (tem != wi::to_widest (vr->min ()))
tem = wi::ext (wi::to_widest (vrmin), dest_precision, dest_sgn);
if (tem != wi::to_widest (vrmin))
return false;
tem = wi::ext (wi::to_widest (vr->max ()), dest_precision, dest_sgn);
if (tem != wi::to_widest (vr->max ()))
tem = wi::ext (wi::to_widest (vrmax), dest_precision, dest_sgn);
if (tem != wi::to_widest (vrmax))
return false;
return true;
@ -1682,7 +1683,8 @@ simplify_using_ranges::simplify_casted_cond (gcond *stmt)
value_range vr;
if (query->range_of_expr (vr, innerop)
&& range_int_cst_p (&vr)
&& !vr.varying_p ()
&& !vr.undefined_p ()
&& range_fits_type_p (&vr,
TYPE_PRECISION (TREE_TYPE (op0)),
TYPE_SIGN (TREE_TYPE (op0)))
@ -2024,7 +2026,8 @@ simplify_using_ranges::simplify_float_conversion_using_ranges
/* We can only handle constant ranges. */
if (!query->range_of_expr (vr, rhs1, stmt)
|| !range_int_cst_p (&vr))
|| vr.varying_p ()
|| vr.undefined_p ())
return false;
/* First check if we can use a signed type in place of an unsigned. */