westfw is right. Since the condition cannot be met, the bug is in your code.
It would be like comparing an unsigned int to a negative number. The compiler could well assume that condition would never be met as well.
In fact I'm right, strangely enough.
This sketch:
void setup ()
{
Serial.begin (115200);
for (unsigned int i = 0; i >= 0; i--)
Serial.println (42);
} // end of setup
void loop () {}
Generates this (after doing the Serial.begin):
d0: 88 e9 ldi r24, 0x98 ; 152
d2: 91 e0 ldi r25, 0x01 ; 1
d4: 6a e2 ldi r22, 0x2A ; 42
d6: 70 e0 ldi r23, 0x00 ; 0
d8: 4a e0 ldi r20, 0x0A ; 10
da: 50 e0 ldi r21, 0x00 ; 0
dc: 0e 94 9b 03 call 0x736 ; 0x736 <_ZN5Print7printlnEii>
e0: f7 cf rjmp .-18 ; 0xd0 <setup+0x10>
Notice how the test has been optimized away, and it just does a Serial.println of 42, and then loops back and does it again?
So it's not at all a compiler bug. The compiler is doing what you told it to do, as efficiently as it can.