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.