http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52483
Bug #: 52483
Summary: SH Target: Loads from volatile memory leave redundant
sign/zero extensions
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: [email protected]
ReportedBy: [email protected]
CC: [email protected]
Target: sh*-*-*
The following cases seem to happen at any optimization level:
int test_0 (volatile char* x)
{
return *x == 5;
}
mov.b @r4,r0 ! 6 *extendqisi2_compact/2 [length = 2]
exts.b r0,r0 ! 7 *extendqisi2_compact/1 [length = 2]
cmp/eq #5,r0 ! 8 cmpeqsi_t/2 [length = 2]
rts ! 27 *return_i [length = 2]
movt r0 ! 14 movsi_ie/10 [length = 2]
int test_1 (volatile unsigned char* x)
{
return *x == 0x80;
}
mov.b @r4,r0 ! 6 *extendqisi2_compact/2 [length = 2]
exts.b r0,r0 ! 8 *extendqisi2_compact/1 [length = 2]
cmp/eq #-128,r0 ! 9 cmpeqsi_t/2 [length = 2]
rts ! 28 *return_i [length = 2]
movt r0 ! 15 movsi_ie/10 [length = 2]
The same also happens for HImode.
Maybe a few peepholes would help here?
Using built-in specs.
COLLECT_GCC=sh-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/sh-elf/4.8.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.8.0 20120304 (experimental) (GCC)