This seems like a bug in gcc.
int main ()
{
long winds = 0;
while (winds != 0)
{
if (*(char *) winds)
break;
}
if (winds == 0 || winds != 0 || *(char *) winds)
abort ();
}
$ gcc -O2 bug.c
$ ./a.out
Segmentation fault
$ gcc -O2 -fno-gcse bug.c
$ ./a.out
Aborted
gcc version 2.95.2 19991024 (release), i586-pc-linux-gnu