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?