Is it OK that gcc optimizes away overflow check?

Agner Fog agner@agner.org
Wed Jul 27 15:03:00 GMT 2011


On 26-07-2011 18:37, Andrew Haley wrote:
> On 07/26/2011 11:35 AM, Andrew Haley wrote:
>
>> Consider
>>
>>    for (i = 0; i<  limit; i++)
>>      f(i * 2);
>>
>> which can be rewritten to
>>
>>    int tmp = limit * 2;
>>    for (i = 0; i<  tmp; i += 2)
>>      f(i);
>>
I tried your example. It doesn't make an induction variable because it 
can do i*2 with the LEA instruction at no extra cost. With i*11 it makes 
two counters:

for (i=0, k=0; i<limit; i++, k+=11) f(k);

I can't make it do what we both expect unless limit is a compile-time 
constant:

for (k=0; k<limit*11; k+=11) f(k);

The reason I'm asking is that it would be interesting to know whether it 
is better to use signed or unsigned integers in order to get the best 
optimizations. I would publish that in my optimization manuals ( 
http://www.agner.org/optimize/#manuals )

Can you give any examples where optimization is better for signed 
integers than for unsigned, or vice versa?



More information about the Gcc-help mailing list