piet@ruuinf (Piet van Oostrum) (02/17/89)
GCC version 1.32 generates wrong code for a switch with a constant
expression.
I have tested it on the Sun3 OS3 and on HCX/UX, so it may be
machine-independent. The behaviour is that it takes the default action
rather than the correct case. This happens independent of -O.
------------------------------------------------------------------------
main()
{ switch(5)
{ case 5 : printf("five\n") ;
break ;
default : printf("default\n") ;
break ;
}
}
------------------------------------------------------------------------
>4> gcc -v test2.c
gcc version 1.32
/usr/staff/lib/gcc-cpp -v -undef -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 test2.c /tmp/cca26671.cpp
GNU CPP version 1.32
/usr/staff/lib/gcc-cc1 /tmp/cca26671.cpp -quiet -dumpbase test2.c -version -o /tmp/cca26671.s
GNU C version 1.32 (68k, MIT syntax) compiled by GNU C version 1.32.
as -mc68020 /tmp/cca26671.s -o test2.o
ld /lib/crt0.o /lib/Mcrt1.o test2.o /usr/staff/lib/gcc-gnulib -lc
>5> a.out
default
>6> gcc -O test2.c
>7> a.out
default
>8> gcc -S -g test2.c
>9> cat test2.s
#NO_APP
gcc_compiled.:
.stabs "test2.c",100,0,0,Ltext
Ltext:
.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
.stabs "char:t2=r2;0;127;",128,0,0,0
.stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0
.stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
.stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0
.stabs "short int:t6=r1;-32768;32767;",128,0,0,0
.stabs "long long int:t7=r1;0;-1;",128,0,0,0
.stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0
.stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0
.stabs "signed char:t10=r1;-128;127;",128,0,0,0
.stabs "unsigned char:t11=r1;0;255;",128,0,0,0
.stabs "float:t12=r1;4;0;",128,0,0,0
.stabs "double:t13=r1;8;0;",128,0,0,0
.stabs "long double:t14=r1;8;0;",128,0,0,0
.stabs "void:t15=15",128,0,0,0
.text
LC0:
.ascii "five\12\0"
LC1:
.ascii "default\12\0"
.even
.globl _main
_main:
.stabd 68,0,3
link a6,#0
jra L4 <<<<<<<< should be jra L3
L3:
.stabd 68,0,4
pea LC0
jbsr _printf
.stabd 68,0,5
addqw #4,sp
jra L2
L4:
.stabd 68,0,6
pea LC1
jbsr _printf
.stabd 68,0,7
addqw #4,sp
jra L2
L2:
.stabd 68,0,9
L1:
unlk a6
rts
.stabs "main:F1",36,0,0,_main
>10>
------------------------------------------------------------------------
--
Piet van Oostrum, Dept of Computer Science, University of Utrecht
Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands
Telephone: +31-30-531806. piet@cs.ruu.nl (mcvax!hp4nl!ruuinf!piet)piet@ruuinf (Piet van Oostrum) (02/17/89)
In article <1141@ruuinf.UUCP>, piet@ruuinf (Piet van Oostrum) writes: `GCC version 1.32 generates wrong code for a switch with a constant `expression. The error is a reversed test in stmt.c: ------------------------------------------------------------------------ *** stmt.c.~1~ Tue Jan 17 13:52:25 1989 --- stmt.c Thu Feb 16 18:19:47 1989 *************** *** 2296,2302 && ! tree_int_cst_lt (n->high, index_expr)) break; } ! if (n) emit_jump (default_label); else emit_jump (label_rtx (n->code_label)); --- 2296,2302 ----- && ! tree_int_cst_lt (n->high, index_expr)) break; } ! if (!n) emit_jump (default_label); else emit_jump (label_rtx (n->code_label)); -- Piet van Oostrum, Dept of Computer Science, University of Utrecht Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands Telephone: +31-30-531806. piet@cs.ruu.nl (mcvax!hp4nl!ruuinf!piet)