Bug#142844: gcc: dead code removal in switch() broken
Package: gcc-2.95
Version: 2.95.4-5
al@wynton:/tmp$ cat b.c
int x;
main()
{
unsigned long n;
switch (x) {
case 6: n = 32; break;
case 5: case 7: case 8: case 11: n = 128; break;
}
x = 0;
printf("%d\n", x);
}
al@wynton:/tmp$ gcc b.c && ./a.out
0
al@wynton:/tmp$ gcc -O2 b.c && ./a.out
Segmentation fault
al@wynton:/tmp$ uname -a
Linux wynton 2.2.18pre21 #1 Wed Nov 22 05:08:09 CST 2000 alpha unknown
It's a cc1 problem - code it generates looks so:
main:
.frame $30,16,$26,0
.mask 0x4000000,-16
ldgp $29,0($27)
$main..ng:
lda $2,x
lda $30,-16($30)
stq $26,0($30)
.prologue 1
fnop
ldl $1,0($2)
mov $2,$3
subl $1,5,$1
zapnot $1,15,$1
cmpule $1,6,$1
.end main
IOW, instead of removing switch() it had left the very beginning of switch()
code in there and killed everything after it. Including ret.
On x86 resulting code works, but it looks rather funny - even with -O6 we
end up with
movl x,%eax
subl $5,%eax
/* values of %eax and flags are never used below */
So it looks like dead code removal is very fishy.
--
To UNSUBSCRIBE, email to debian-gcc-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Reply to: