https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113106
--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> --- Perhaps related, --cut here-- int a; int foo(void) { return *(volatile int *) &a + *(volatile int *) &a; } --cut here-- compiles with -O2 to: movl a(%rip), %eax movl a(%rip), %edx addl %edx, %eax ret but may be compiled to: movl a(%rip), %eax addl a(%rip), %eax ret (the memory read may propagate to the insn)