Re: Question on signed overflow

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 06/18/2010 08:56 AM, Georg Lay wrote:
> Hi, I have a question on gcc's signed overflow optimisation in the
> following C function:
> 
> int abssat2 (int x)
> {
>     unsigned int y = x;
> 
>     if (x < 0)
>         y = -y;
> 
>     if (y >= 0x80000000)
>         y--;
> 
>     return y;
> }
> 
> gcc optimises the second comparison and throws it away, and that's the
> part I do not understand because all computations are performed on
> unsigned int which has no undefined behaviour on overflow.
> 
> For the unary - the standard says in 6.5.3.3.3:
>  The result of the unary - operator is the negative of its (promoted)
>  operand. The integer promotions are performed on the operand, and
>  the result has the promoted type.
> 
> And the promotion rules in 6.3.1.1.2:
>   If an int can represent all values of the original type, the value
>   is converted to an int; otherwise, it is converted to an unsigned int.
>   These are called the integer promotions. All other types are unchanged
>   by the integer promotions.
> 
> As an int cannot represent all values that can be represented by an
> unsigned int, there is no signed int in the line y = -y.
> 
> Could anyone explain this? I see this on gcc 4.4.3.

Works for me on gcc 4.4.3:

	movl	%edi, %eax
	sarl	$31, %eax
	xorl	%eax, %edi
	subl	%eax, %edi
	movl	%edi, %eax
	shrl	$31, %eax
	subl	%eax, %edi
	movl	%edi, %eax
	ret

Andrew.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux