https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125513

--- Comment #7 from Drea Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Drea Pinski from comment #5)
> So while operator_mult frange has support for `a*a`, irange does not. 
> Now to figure out how to fix that.
> 
> 
> That is operator_mult::rv_fold supports is_square but
> operator_mult::op2_range seemly does not.

Actually op1_op2_relation_effect was what was needed but I have it working:
```
bool
operator_mult::op1_op2_relation_effect (irange &lhs_range, tree type,
                                        const irange &op1_range,
                                        const irange &op2_range,
                                        relation_kind rel) const
{
  if (rel != VREL_EQ
      || op1_range != op2_range
      || !TYPE_OVERFLOW_UNDEFINED (type))
    return false;
  /* a*a is nonnegative. */
  int_range<2> nonnegative;
  nonnegative.set_nonnegative (type);
  lhs_range.intersect (nonnegative);
  return true;
}
```

Now to audit the rest of tree_expr_nonnegative_p .

Reply via email to