This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] convert.c: Fix PR tree-optimization/25125.


unsigned short
f (short a)
{
 short b;

 if (a > 0)
   return 0;
 b = ((int) a) + - (int) 32768;
 return b;
}

For a = 0, that seems to be the correct result.
For a = -1, the original wants to do b = -32769, which seems undefined, and thus the result is correct. Similarly for even more negative a.


Where is the actual bug here?

The point is that *truncation* is defined to use modulo arithmetic. Arithmetic operations are undefined on overflow. So, summing -1 and -32768 as shorts is undefined (but this cannot be expressed in C on a 32-bit machine, because everything promotes to int), but the above is the same as (short)(-32769) which is 32767.


On a 16-bit machine, the above would be undefined because it would indeed run into an overflow while summing -1 and -32768.

But GCC was trying to do the sum in 16-bits even on 32-bit machines, and this is possible only if we can guarantee that operations that overflow are defined.

Paolo


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]