in the following code gcc choses the registers in such a way that it causes itself an extra copy for every loop iteration and has to jump past the copy to start the loop... it's probably easiest to describe just by looking at the code:
% cat jmp-over.c void foo(int *v, int *d, int g) { int s = v[1]; int s0; do { s0 = s; s += *d; ++d; } while (s < g); v[0] = s0; } % gcc -g -O3 -Wall -c -o jmp-over.o jmp-over.c % objdump -dr jmp-over.o jmp-over.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <foo>: 0: 8b 4f 04 mov 0x4(%rdi),%ecx 3: eb 02 jmp 7 <foo+0x7> 5: 89 c1 mov %eax,%ecx 7: 89 c8 mov %ecx,%eax 9: 03 06 add (%rsi),%eax b: 48 83 c6 04 add $0x4,%rsi f: 39 d0 cmp %edx,%eax 11: 7c f2 jl 5 <foo+0x5> 13: 89 0f mov %ecx,(%rdi) 15: c3 retq the jump-over is unnecessary... mov 0x4(%rdi),%ecx 1: mov %ecx,%eax add (%rsi),%ecx add $0x4,%rsi cmp %edx,%ecx jl 1b mov %eax,(%rdi) retq -dean % gcc -v Using built-in specs. Target: x86_64-linux-gnu Configured with: ../gcc/configure --prefix=/home/odo/gcc --host=x86_64-linux-gnu --disable-multilib --enable-languages=c,c++ --disable-bootstrap Thread model: posix gcc version 4.2.0 20060603 (experimental) -- Summary: unnecessary jump to middle of loop on entry Product: gcc Version: 4.2.0 Status: UNCONFIRMED Severity: minor Priority: P3 Component: pending AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: dean at arctic dot org GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27986