Compiling the code below (extracted from xterm-202) with -fno-inline -O2 -march=i686
typedef unsigned long Atom; static int CutBuffer(unsigned code) { int cutbuffer; switch (code) { case ((Atom) 9): cutbuffer = 0; break; case ((Atom) 10): cutbuffer = 1; break; case ((Atom) 11): cutbuffer = 2; break; case ((Atom) 12): cutbuffer = 3; break; case ((Atom) 13): cutbuffer = 4; break; case ((Atom) 14): cutbuffer = 5; break; case ((Atom) 15): cutbuffer = 6; break; case ((Atom) 16): cutbuffer = 7; break; default: cutbuffer = -1; break; } return cutbuffer; } int foo (unsigned code) { return CutBuffer (code); } generates: CutBuffer: subl $9, %eax movl $-1, %edx pushl %ebp cmpl $7, %eax movl %esp, %ebp ja .L12 jmp *.L11(,%eax,4) .section .rodata .align 4 .align 4 .L11: .long .L3 .long .L4 .long .L5 .long .L6 .long .L7 .long .L8 .long .L9 .long .L10 .text .L9: movl $6, %edx .p2align 4,,15 .L12: popl %ebp movl %edx, %eax ret .L3: popl %ebp xorl %edx, %edx movl %edx, %eax .p2align 4,,2 ret .L10: popl %ebp movl $7, %edx movl %edx, %eax ret .L8: popl %ebp movl $5, %edx movl %edx, %eax ret .L7: popl %ebp movl $4, %edx movl %edx, %eax ret .L6: popl %ebp movl $3, %edx movl %edx, %eax ret [snip] Note the sequences: movl NUMBER, %edx movl %edx, %eax instead of using only one instruction for the same thing: movl NUMBER, %eax -- Summary: poor code generation for i686 Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: dann at godzilla dot ics dot uci dot edu CC: gcc-bugs at gcc dot gnu dot org GCC host triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23100