O2 Agressive Optimisation by GCC

Martin Sebor msebor@gmail.com
Fri Jul 20 18:17:00 GMT 2018


On 07/20/2018 06:19 AM, Umesh Kalappa wrote:
> Hi All ,
>
> We are looking at the C sample i.e
>
> extern int i,j;
>
> int test()
> {
> while(1)
> {       i++;
>         j=20;
> }
> return 0;
> }
>
> command used :(gcc 8.1.0)
> gcc -S test.c -O2
>
> the generated asm for x86
>
> .L2:
>         jmp     .L2
>
> we understand that,the infinite loop is not  deterministic ,compiler
> is free to treat as that as UB and do aggressive optimization ,but we
> need keep the side effects like j=20 untouched by optimization .
>
> Please note that using the volatile qualifier for i and j  or empty
> asm("") in the while loop,will stop the optimizer ,but we don't want
> do  that.
>
> Anyone from the community ,please share their insights why above
> transformation is right ?

The loop isn't necessarily undefined (and compilers don't look
for undefined behavior as opportunities to optimize code), but
because it doesn't terminate it's not possible for a conforming
C program to detect the side-effects in its body.  The only way
to detect it is to examine the object code as you did.

Compilers are allowed (and expected) to transform source code
into efficient object code as long as the transformations don't
change the observable effects of the program.  That's just what
happens in this case.

Martin



More information about the Gcc mailing list