Source: int g1,g2,g3; int f1(int a, int b) { a &= 1;
if (a) return g1; return g2; } int f2(int a, int b) { a &= 1; if (b) g3++; if (a) return g1; return g2; } Compiled with: > gcc -O3 -fomit-frame-pointer -S and_flags.c f1 is ok but f2 generates this: _f2: andl $1, %edi <-- #1 testl %esi, %esi je L7 movq _...@gotpcrel(%rip), %rax incl (%rax) L7: testl %edi, %edi <-- #2 jne L10 movq _...@gotpcrel(%rip), %rax movl (%rax), %eax ret .align 4,0x90 L10: movq _...@gotpcrel(%rip), %rax movl (%rax), %eax ret The andl and testl should be folded into one andl. Code is reduced from ffmpeg h264 decoder. It's easy to work around by reordering source lines, so not too important. -- Summary: x86 flags not combined across blocks Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: astrange at ithinksw dot com GCC host triplet: x86_64-*-* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43233