http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55146
Bug #: 55146 Summary: jumptables with byte entries produce wrong code with -Os/-O2 for SH-1 Classification: Unclassified Product: gcc Version: 4.6.3 Status: UNCONFIRMED Severity: critical Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: marcin.bu...@gmail.com Created attachment 28580 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28580 testcase C file Switch statement with enough cases inside is translated to jumptable. If the offsets are small enough, byte entries are used. If there is odd number of cases this implies padding byte (since all SH instructions are 2 byte wide). In the corner case this padding byte can cause the offset to switch from positive to negative since move.b instruction used to fetch jumptable entry sign extends the byte. This bug is very old and dates back at least to 4.0.3 days. See attachment. When compiled with sh-elf-gcc -Os -c test-jens.c -o sh-test.o it produces wrong jumping code. http://pastebin.com/ZgJK3bgS has slightly commented disassembly to point out what I mean. The workaround is to decrease MIN_OFFSET by one for byte case in gcc/config/sh/sh.h . This is not a proper fix though.