http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50751
Bug #: 50751 Summary: SH Target: Displacement addressing does not work for QImode and HImode Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: oleg.e...@t-online.de CC: kkoj...@gcc.gnu.org Target: sh*-*-* Displacement addressing is only used for SImode but not for QImode nor HImode. The following example summarizes the problem: struct X { char a, b, c, d; short e, f; int g, h; }; int test_func_4 (X* x) { return x->b + x->e + x->g; } compiled with: -Os -m4-single -ml -S mov r4,r1 add #1,r1 mov.b @r1,r0 add #3,r1 mov.w @r1,r1 add r1,r0 mov.l @(8,r4),r1 rts add r1,r0 would be better as: mov.b @(1,r4),r0 mov r0,r1 mov.w @(4,r4),r0 add r0,r1 mov.l @(8,r4),r0 add r1,r0 rts nop Using built-in specs. COLLECT_GCC=sh-elf-gcc COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/sh-elf/4.7.0/lto-wrapper Target: sh-elf Configured with: ../gcc-trunk/configure --target=sh-elf --prefix=/usr/local --enable-languages=c,c++ --enable-multilib --disable-libssp --disable-nls --disable-werror --enable-lto --with-newlib --with-gnu-as --with-gnu-ld --with-system-zlib Thread model: single gcc version 4.7.0 20111016 (experimental) (GCC)