On 2/15/23 13:42, Andrew MacLeod wrote:

On 2/15/23 12:50, Andrew MacLeod wrote:

On 2/15/23 12:13, Tamar Christina wrote:
On 2/15/23 07:51, Tamar Christina wrote:
void
operator_plus::wi_fold (irange &r, tree type,
                        const wide_int &lh_lb, const wide_int &lh_ub,
                        const wide_int &rh_lb, const wide_int &rh_ub) const
{
  wi::overflow_type ov_lb, ov_ub;
  signop s = TYPE_SIGN (type);

  // Do whatever wideint magic is required to do this adds in higher precision
  wide_int new_lb = wi::add (lh_lb, rh_lb, s, &ov_lb);
  wide_int new_ub = wi::add (lh_ub, rh_ub, s, &ov_ub);

  r = int_range<2> (type, new_lb, new_ub);
}


The operator needs to be registered, I've attached the skeleton for it.  you should just have to finish implementing wi_fold().

in theory :-)

You also mentioned earlier that some were tree codes, some were internal function calls?  We have some initial support for built in functions, but I am not familiar with all the various forms they can take.  We currently support CFN_ functions in

  gimple-range-op.cc, gimple_range_op_handler::maybe_builtin_call ()

Basically this is part of a "gimple_range_op_handler"  wrapper for range-ops which can provide a range-ops class for stmts that don't map to a binary or unary form.. such as built in functions.

If you get to the point where you need this for a builtin function, I can help you through that too.  Although someone may have to also help me through what differentiates the different kinds of internal function :-)    I presume they are all similar in some way.

Andrew

Oh yeah, and in case you haven't figured it out on your own, you'll have to remove WIDEN_MULT_EXPR from the range-ops init table.   This non-standard mechanism only gets checked if there is no standard range-op table entry for the tree code :-P

Andrew

Andrew

Reply via email to