Raeburn@ATHENA.MIT.EDU (Ken Raeburn) (03/01/90)
(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.