------- Comment #7 from jakub at gcc dot gnu dot org 2010-02-18 12:30 ------- On the 4.4 branch actually cc1 behaves differently from cc1plus. In any case, I believe the two setne's plus testb code is actually the worst of the options, and e.g. with -Os it is even much larger. Just compile the testcase on 4.5 with -Os and -Os -D'__builtin_expect(a,b)=(a)' In the former case (i.e. with __builtin_expect) if generates: cmpq %rcx, %rdx sete %dl xorl %eax, %eax cmpq %rsi, %rdi movzbl %dl, %edx sete %al testl %eax, %edx je .L2 xorl %eax, %eax jmp likely .L2: xorl %eax, %eax jmp unlikely while in the latter case generates: cmpq %rcx, %rdx jne .L2 cmpq %rsi, %rdi jne .L2 xorl %eax, %eax jmp likely .L2: xorl %eax, %eax jmp unlikely (what would be actually the best code for -O2 when __builtin_expect is used and tells that likely () is likely).
-- jakub at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bonzini at gnu dot org Known to work|4.1.2 4.5.0 |4.1.2 Summary|[4.3/4.4 regression] c++ |[4.3/4.4/4.5 regression] c++ |builtin_expect code |builtin_expect code |generation regression |generation regression http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42233