I've reported here recently about gcc producing conditional branches
with static outcome. I've finally managed to produce a simple
self-contained example. Here it is:

int f()
{
    static int LSW=-1;
    double x=0.987654321;
    unsigned char ix = *((char *)&x);
    if(ix==0xdd || ix==0x3f)
        LSW = 1;
    else
        LSW = 0;
    return 0;
}

Compiling this with "gcc-4.5 -O3 -c f.c" (20100304 snapshot) on my
x86-64 system produces the following code:

   0:   b8 b8 ff ff ff          mov    $0xffffffb8,%eax
   5:   3c dd                   cmp    $0xdd,%al
   7:   0f 94 c0                sete   %al
   ...

Ok, not a branch, but still useless code. gcc-4.4 does the same, and
gcc-4.3 is slightly less clever (it moves the whole immediate 8 bytes
into %rax and does two cmp+je).

I first thought the type-cast was responsible. But if you replace the
assignment to LSW with a simple return, gcc correctly optimizes the
whole function away.

Can anybody confirm this?  Is it worth a bug report?

-- Alain.

Reply via email to