http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48580
--- Comment #1 from joseph at codesourcery dot com <joseph at codesourcery dot
com> 2011-04-12 20:18:13 UTC ---
On Tue, 12 Apr 2011, zackw at panix dot com wrote:
> To the best of my knowledge, this is the only safe way (without -fwrapv) to
> check whether the product of two signed integers overflowed:
>
> bool product_does_not_overflow(signed x, signed y)
> {
> unsigned tmp = x * unsigned(y);
>
> return signed(tmp) > 0 && tmp / x == unsigned(y);
> }
Two signed integers given that they are known to be positive, anyway.
This may return unexpected results if either or both arguments are
negative or zero.
I sort of think GCC should have built-in functions exposing C and C++
interfaces for: each basic arithmetic operation, defined to wrap; each
basic arithmetic operation, defined to saturate; each basic arithmetic
operation, defined to have undefined overflow; each basic arithmetic
operation, with a separate overflow flag being set; each basic arithmetic
operation, defined to trap on overflow. All of these for both signed and
unsigned and for any desired number of bits (up to the maximum number
supported for arithmetic, so generally 1-64 bits on 32-bit configurations
and 1-128 bits on 64-bit configurations); except for the defined-to-trap
case, all would still have undefined behavior on division by 0. You could
then have optimizations mapping generic C idioms to such built-in
operations where the target supports efficient code for the operations.
But this rather relies on the no-undefined-overflow work being finished
first so that some of the required operations actually exist inside GCC,
before they can easily be exposed to the user.
> which is a pretty substantial micro-win, particularly in getting rid of a
> divide.
(If the function gets called with one constant operand, you can make it
inline and use __builtin_constant_p to replace a divide with a range check
on the other operand. That's only useful for some cases of overflow
checks, of course.)