For what it's worth, there is at least _another_ regression introduced by the -4 or -5 revision in -O0, that I've not been able to track down yet. I mean that when I remove all my uses of __builtin_expect in the code that lead me to find out about this bug, I still have (at least) another issue that pops up at the -O0 level that never shows up with any other gcc release. And I deeply trust the mentioned code to be correct. The code in question uses a lot of gcc __builtin_* functions if that helps (ctz, clz, bswap among other).
On Thu, Apr 01, 2010 at 01:38:20AM +0200, Pierre Habouzit wrote: > Package: gcc-4.4 > Version: 4.4.3-4 > Severity: grave > > Since gcc-4.4 version 4.4.3-4 (and yes -5 is still affected), gcc miscompiles > __builtin_expect when no optimization is set (at least). > > Test case: > > int foo(int t) { > if (__builtin_expect(t & 0x100, 0)) > return 0; > return 1; > } > > > Bad assembly: > > gcc -O0 -S -o /dev/stdout a.c > .file "a.c" > .text > .globl foo > .type foo, @function > foo: > .LFB0: > .cfi_startproc > pushq %rbp > .cfi_def_cfa_offset 16 > movq %rsp, %rbp > .cfi_offset 6, -16 > .cfi_def_cfa_register 6 > movl %edi, -4(%rbp) > movl -4(%rbp), %eax > cltq > andl $256, %eax > movzbl %al, %eax <--------------------- > testq %rax, %rax > je .L2 > movl $0, %eax > jmp .L3 > .L2: > movl $1, %eax > .L3: > leave > ret > .cfi_endproc > .LFE0: > .size foo, .-foo > .ident "GCC: (Debian 4.4.3-5) 4.4.3" > .section .note.GNU-stack,"",@progbits > > The buggy line is marked with the arrow. > gcc-4.4 version 4.4.3-3 is correct and doesn't perform the buggy movzbl. -- ·O· Pierre Habouzit ··O madco...@debian.org OOO http://www.madism.org -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org