------- Comment #1 from astrange at ithinksw dot com 2010-07-01 03:43 ------- The problem is combine.
This: int test2( int *b ) { int b_ = *b; b_--; if( b_ == 0 ) { *b = b_; return foo(); } *b = b_; return 0; } works: _test2: LFB1: movl (%rdi), %eax decl %eax je L7 <- uses decl movl %eax, (%rdi) xorl %eax, %eax ret .align 4,0x90 L7: movl $0, (%rdi) xorl %eax, %eax jmp _foo The original turns (*b)-- into load/dec/store/cmp - combine tries to combine dec/store which fails, but doesn't try dec/cmp. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44474