Convert CFN_BUILT_IN_PARITY to range-ops.
Also, as the last builtin remaining, also remove the builtin infrastrucure routines from fold_using_range. * gimple-range-fold.cc (range_of_range_op): Handle no operands. (range_of_call): Do not check for builtins. (fold_using_range::range_of_builtin_call): Delete. (fold_using_range::range_of_builtin_int_call): Delete. * gimple-range-fold.h: Adjust prototypes. * gimple-range-op.cc (class cfn_parity): New. (gimple_range_op_handler::maybe_builtin_call): Set arguments.
This commit is contained in:
parent
e7f035f66a
commit
5608e41091
3 changed files with 31 additions and 52 deletions
|
@ -534,6 +534,16 @@ fold_using_range::range_of_range_op (vrange &r,
|
|||
tree lhs = handler.lhs ();
|
||||
tree op1 = handler.operand1 ();
|
||||
tree op2 = handler.operand2 ();
|
||||
|
||||
// Certain types of builtin functions may have no arguments.
|
||||
if (!op1)
|
||||
{
|
||||
Value_Range r1 (type);
|
||||
if (!handler.fold_range (r, type, r1, r1))
|
||||
r.set_varying (type);
|
||||
return true;
|
||||
}
|
||||
|
||||
Value_Range range1 (TREE_TYPE (op1));
|
||||
Value_Range range2 (op2 ? TREE_TYPE (op2) : TREE_TYPE (op1));
|
||||
|
||||
|
@ -823,7 +833,7 @@ fold_using_range::range_of_phi (vrange &r, gphi *phi, fur_source &src)
|
|||
// If a range cannot be calculated, return false.
|
||||
|
||||
bool
|
||||
fold_using_range::range_of_call (vrange &r, gcall *call, fur_source &src)
|
||||
fold_using_range::range_of_call (vrange &r, gcall *call, fur_source &)
|
||||
{
|
||||
tree type = gimple_range_type (call);
|
||||
if (!type)
|
||||
|
@ -832,9 +842,7 @@ fold_using_range::range_of_call (vrange &r, gcall *call, fur_source &src)
|
|||
tree lhs = gimple_call_lhs (call);
|
||||
bool strict_overflow_p;
|
||||
|
||||
if (range_of_builtin_call (r, call, src))
|
||||
;
|
||||
else if (gimple_stmt_nonnegative_warnv_p (call, &strict_overflow_p))
|
||||
if (gimple_stmt_nonnegative_warnv_p (call, &strict_overflow_p))
|
||||
r.set_nonnegative (type);
|
||||
else if (gimple_call_nonnull_result_p (call)
|
||||
|| gimple_call_nonnull_arg (call))
|
||||
|
@ -852,50 +860,6 @@ fold_using_range::range_of_call (vrange &r, gcall *call, fur_source &src)
|
|||
return true;
|
||||
}
|
||||
|
||||
// For a builtin in CALL, return a range in R if known and return
|
||||
// TRUE. Otherwise return FALSE.
|
||||
|
||||
bool
|
||||
fold_using_range::range_of_builtin_call (vrange &r, gcall *call,
|
||||
fur_source &src)
|
||||
{
|
||||
combined_fn func = gimple_call_combined_fn (call);
|
||||
if (func == CFN_LAST)
|
||||
return false;
|
||||
|
||||
tree type = gimple_range_type (call);
|
||||
gcc_checking_assert (type);
|
||||
|
||||
if (irange::supports_p (type))
|
||||
return range_of_builtin_int_call (as_a <irange> (r), call, src);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
fold_using_range::range_of_builtin_int_call (irange &r, gcall *call,
|
||||
fur_source &)
|
||||
{
|
||||
combined_fn func = gimple_call_combined_fn (call);
|
||||
if (func == CFN_LAST)
|
||||
return false;
|
||||
|
||||
tree type = gimple_range_type (call);
|
||||
scalar_int_mode mode;
|
||||
|
||||
switch (func)
|
||||
{
|
||||
CASE_CFN_PARITY:
|
||||
r.set (build_zero_cst (type), build_one_cst (type));
|
||||
return true;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Calculate a range for COND_EXPR statement S and return it in R.
|
||||
// If a range cannot be calculated, return false.
|
||||
|
||||
|
|
|
@ -165,10 +165,6 @@ protected:
|
|||
bool range_of_call (vrange &r, gcall *call, fur_source &src);
|
||||
bool range_of_cond_expr (vrange &r, gassign* cond, fur_source &src);
|
||||
bool range_of_address (irange &r, gimple *s, fur_source &src);
|
||||
bool range_of_builtin_call (vrange &r, gcall *call, fur_source &src);
|
||||
bool range_of_builtin_int_call (irange &r, gcall *call, fur_source &src);
|
||||
void range_of_builtin_ubsan_call (irange &r, gcall *call, tree_code code,
|
||||
fur_source &src);
|
||||
bool range_of_phi (vrange &r, gphi *phi, fur_source &src);
|
||||
void range_of_ssa_name_with_loop_info (vrange &, tree, class loop *, gphi *,
|
||||
fur_source &src);
|
||||
|
|
|
@ -663,6 +663,20 @@ private:
|
|||
bool m_is_pos;
|
||||
} op_cfn_goacc_dim_size (false), op_cfn_goacc_dim_pos (true);
|
||||
|
||||
|
||||
// Implement range operator for CFN_BUILT_IN_
|
||||
class cfn_parity : public range_operator
|
||||
{
|
||||
public:
|
||||
using range_operator::fold_range;
|
||||
virtual bool fold_range (irange &r, tree type, const irange &,
|
||||
const irange &, relation_kind) const
|
||||
{
|
||||
r.set (build_zero_cst (type), build_one_cst (type));
|
||||
return true;
|
||||
}
|
||||
} op_cfn_parity;
|
||||
|
||||
// Set up a gimple_range_op_handler for any built in function which can be
|
||||
// supported via range-ops.
|
||||
|
||||
|
@ -795,6 +809,11 @@ gimple_range_op_handler::maybe_builtin_call ()
|
|||
m_int = &op_cfn_goacc_dim_pos;
|
||||
break;
|
||||
|
||||
CASE_CFN_PARITY:
|
||||
m_valid = true;
|
||||
m_int = &op_cfn_parity;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue