https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112600
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- Note we don't have a good middle-end representation for (integer) saturation. Maybe having variants of .ADD_OVERFLOW and friends specifying an alternate value (or the value in case the actual value is left unspecified when overflow occurs) as additional argument would work. So have the first fold into <bb 2> : _8 = .ADD_OVERFLOW (x_6(D), y_7(D), -1u); _1 = REALPART_EXPR (_8); return _1; of course that defers the code-generation problem to RTL expansion and would require to pattern match res = x + y; res |= -(res < x); to the same for canonicalization purposes. I would expect that some targets implement saturating integer arithmetic (not sure about multiplication or division though).