Path: utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!tut.cis.ohio-state.edu!ATHENA.MIT.EDU!Raeburn From: Raeburn@ATHENA.MIT.EDU (Ken Raeburn) Newsgroups: gnu.gcc.bug Subject: extra labels not optimized away Message-ID: <9002282012.AA12485@prometheus.MIT.EDU> Date: 28 Feb 90 20:12:46 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 58 (1.37,vax) Source file: extern int i; int foo (void) { switch (i) { case 2: i = 12; return 9; case 1: i = 3; return 9; case 3: i = 3; return 9; default: i = 3; return 9; } } Assembly code produced with "-O -fcombine-regs -fstrength-reduce -fforce-mem" (our default -O configuration for vax): #NO_APP gcc_compiled.: .text .align 1 .globl _foo _foo: .word 0x0 movl _i,r0 cmpl r0,$2 jeql L2 jleq L5 cmpl r0,$3 # unnecessary distinction jeql L4 jbr L5 L2: movl $12,_i movl $9,r0 ret L4: # no code between labels L5: movl $3,_i movl $9,r0 ret In the case where `I' is 3 (but not 1), extra comparison code is generated, and two branches -- one conditional, one unconditional -- transfer to the same instruction regardless of the comparison result. This doesn't happen in all cases; in fact, in most cases (like `1' above), the extra labels and code are removed. However, there are some pieces of code (with lots of labels, not switch statements) not entirely unlike this in gcc's own insn-recog routines (vax version), for example, so it may improve the compiler itself to fix this.