http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44281
--- Comment #8 from Adam Warner <adam at consulting dot net.nz> 2011-03-04 10:51:01 UTC --- Jakub, I fail to see how your conclusion not to do this is supported by the facts. There are: (a) six global register variables (though the same effect can be observed with one global register variable and -ffixed-rbx -ffixed-r12 -ffixed-r13 -ffixed-r14 -ffixed-r15) (b) six function arguments (c) one stack pointer Therefore three registers remain free: %rax, %r10 and %r11. Only one free register is required to generate the optimal code. GCC 4.5 can do this. GCC 4.6 can't. The fact GCC outputs the assembly sequence "mov %rdi,%r10; mov %r10,%rdi" is evidence of a bizarre cascade of bugs. Even rudimentary pinhole optimisation could elide that assembly sequence. Are you able to explain why GCC outputs assembly code for a register that is never unmodified? %rdi remains unmodified. This has nothing to do with a "compiler has much more limited choices in generating close to optimal code". The compiler has the choice to use %rax, %r10 or %r11 to store the address to jump to without spilling. There is no register pressure in this example. One register is required. Three are available.