http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38126

--- Comment #4 from Steven Fuerst <svfuerst at gmail dot com> 2012-02-02 
06:11:27 UTC ---
Two more cases for simple boolean logic optimizations.

gcc-4.7 produces with -O3 for

int test_and(long long x, long long y)
{
    return x && y;
}

    test   %rsi, %rsi
    setne  %dl
    xor    %eax, %eax
    test   %rdi, %rdi
    setne  %al
    and    %edx, %eax
    retq

Whereas this is faster:

    neg %rdi
    sbb %rdi, %rdi
    xor %eax, %eax
    and %rsi, %rdi
    setne %al
    retq

Also

int test_other(long long x, long long y)
{
    return !x && y; /* or !(x || !y) */
}

gives

    test   %rsi,%rsi
    setne  %dl
    xor    %eax,%eax
    test   %rdi,%rdi
    sete   %al
    and    %edx,%eax
    retq

when
    sub $1, %rsi
    sbb %rsi, %rsi
    xor %eax, %eax
    or %rdi, %rsi
    sete %al
    retq
is faster.

Reply via email to