[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: