https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70041

            Bug ID: 70041
           Summary: gcc -O2 generate different assembly code
           Product: gcc
           Version: 4.8.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lyhscut at 163 dot com
  Target Milestone: ---

I have written two simple program to test the gcc optimization. I compiled them
with -O2, but there is some difference of the assembly code. In my programs, I
want to output "hello" in the loop, and add some delay between each output.
These two programs are only for illustrating the bug (I think it maybe), and I
know I can using volatile or asm in prgram 1 to achive my purpose. 

Program 1

#include <stdio.h>

int main(int argc, char **argv)
{
        unsigned long i = 0;
        while (1) {
                if (++i > 0x1fffffffUL) {
                        printf("hello\n");
                    i = 0;
                }
        }
}

Compile with -O2, the assembly code is:

Disassembly of section .text.startup:

00000000 <_main>:
#include <stdio.h>

int main(int argc, char **argv)
{
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 e4 f0                and    $0xfffffff0,%esp
   6:   83 ec 10                sub    $0x10,%esp
   9:   e8 00 00 00 00          call   e <_main+0xe>
   e:   66 90                   xchg   %ax,%ax
  10:   c7 04 24 00 00 00 00    movl   $0x0,(%esp)
  17:   e8 00 00 00 00          call   1c <_main+0x1c>
  1c:   eb f2                   jmp    10 <_main+0x10>
  1e:   90                      nop
  1f:   90                      nop


Program 2

int main(int argc, char **argv)
{
        unsigned long i = 0;
        while (1) {
                if (i > 0x1fffffffUL) {
                        printf("hello\n");
                        i = 0;
                }
                i++;
        }
}

Compile with -O2, the assembly code is:

Disassembly of section .text.startup:

00000000 <_main>:
#include <stdio.h>

int main(int argc, char **argv)
{
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 e4 f0                and    $0xfffffff0,%esp
   6:   83 ec 10                sub    $0x10,%esp
   9:   e8 00 00 00 00          call   e <_main+0xe>
   e:   31 c0                   xor    %eax,%eax
  10:   83 c0 01                add    $0x1,%eax
  13:   3d ff ff ff 1f          cmp    $0x1fffffff,%eax
  18:   76 f6                   jbe    10 <_main+0x10>
  1a:   c7 04 24 00 00 00 00    movl   $0x0,(%esp)
        while (1) {
                if (i > 0x1fffffffUL) {
                        printf("hello\n");
                        i = 0;
                }
                i++;
  21:   e8 00 00 00 00          call   26 <_main+0x26>

int main(int argc, char **argv)
{
        unsigned long i = 0;
        while (1) {
                if (i > 0x1fffffffUL) {
  26:   31 c0                   xor    %eax,%eax
  28:   eb e6                   jmp    10 <_main+0x10>
                        printf("hello\n");
  2a:   90                      nop
  2b:   90                      nop
  2c:   90                      nop
  2d:   90                      nop
  2e:   90                      nop
  2f:   90                      nop


In program 1, the increasement of i is optimized out, but it's not in program
2. Why this happens? Is it a bug of gcc -O2?

Reply via email to