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

--- Comment #3 from Antony Polukhin <antoshkka at gmail dot com> ---
(In reply to Richard Biener from comment #2)
<...>
> If it produces an unspecified value it doesn't raise undefined behavior,
> right?
> So replacing it with lhs += 2; is incorrect as if that overflows that's
> undefined behavior.  So we could only replace it with lhs =
> (int)((unsigned)lhs + 2) and produce implementation defined behavior from
> "unspecified" which I suppose is OK.

There's a subset of cases that do not touch UBs and are possible to implement
without fp:

unsigned long long test01(unsigned lhs) {
    return lhs + 2.0; // Never overflows
}

unsigned test02(unsigned lhs) {
    return lhs + 2.0; // No signed overflow
}


Both of the above cases clang optimizes into integral addition.

Reply via email to