[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: