Bug#576111: gcc-4.4 miscompiles __builtin_expect in -O0
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.
Reply to: