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

--- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Marc Glisse from comment #11)
> (In reply to Jakub Jelinek from comment #10)
> > I know, it will be a small complication, sure, but it can be handled.
> 
> Ah, I think I understand now. But still
> 
> x=-1
> a=INT_MAX
> a*x+x gives INT_MIN without overflow.
> Now a could be (int)((unsigned)b-1) where b is INT_MIN. But we don't want to
> generate b*x for that (INT_MIN*-1), since it overflows. So we would need to
> do the multiplication in some unsigned type. If we go there (do everything
> unsigned), we could do the transformation always, and restricting it is just
> a heuristic for when the signed type information might be more useful than
> the factorized form.

The comments at least in fold-const.c say clearly that we do not want to
perform unsigned multiplication.
I was talking about the int a, b;
((int)(a-1U))*b+b
transformation into a*b.
Even for a=0, it is -1*b+b into 0, there could be UB before, but there is none
after.  a=INT_MIN used to be INT_MAX*b+b and newly INT_MIN*b, well defined for
b=0, UB for b > 0, UB for b < -1, but it is true that INT_MAX*-1+-1 is well
defined INT_MIN, but INT_MIN*-1 is UB.
So guess we need to use range info only then.

Reply via email to