void foo (int& sz, int n) { for (++n; --n;) sz += 5; } Produces (-Os):
_Z3fooRii: incl %esi jmp .L2 .L3: addl $5, (%rdi) .L2: decl %esi jne .L3 ret gcc thinks that every little change to sz needs to be stored in memory, causing the above inefficiency of emitting a loop instead of a multiplication. It would be desirable to treat sz as a local variable and optimize as if: void bar (int& sz, int n) { int tmp = sz; for (++n; --n;) tmp += 5; sz = tmp; } Which compiles to: _Z3barRii: leal (%rsi,%rsi,4), %esi addl %esi, (%rdi) ret much better code. If somebody really does need each variable access to be a memory access, that variable should be declared volatile. If you don't want to fix this, at least provide a variable attribute to tell the compiler that it's ok to omit stores. -- Summary: Non-volatile variables don't need to be constantly modified Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: msharov at users dot sourceforge dot net GCC host triplet: x86_64-gnu-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45243