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 .