In one case the C compiler can optimize away an inline memcpy() on a MIPS target. The problem was duplicated with GCC 3.2.1 and 3.3.3. The problem does not affect x86 targets or GCC 4.x (tested on 4.2.4). The MIPS cross-compiler runs under RHEL. Tested MIPS cross-compilers under Cygwin and Mingw with the same results. This is the test code and the resulting output. The "if" statement and 16-byte memcpy() are optimized away, leaving only the 4-byte memcpy. Compile with: mipsisa32-elf-gcc -O2 -c test.c --------------------------- #include <string.h> typedef struct { char C[16]; int E; } st; void f( st *S, char* c ); void f( st *S, char* c ) { if ( S->E == 6 ) memcpy( &S->C, c, 16 ); else memcpy( &S->C, c, 4 ); } --------------------------- 00000000 <f>: 0: 88a20000 lwl v0,0(a1) 4: 98a20003 lwr v0,3(a1) 8: a8820000 swl v0,0(a0) c: 03e00008 jr ra 10: b8820003 swr v0,3(a0) --------------------------- Compiler info: $ mipsisa32-elf-gcc -v Reading specs from /tools/ecos/3.2.1_opt/Linux/opt/ecos/gnutools/mipsisa32-elf/bin/../lib/gcc-lib/mipsisa32-elf/3.2.1/specs Configured with: /home/msieweke/ecos20/gnutools-src/gcc-3.2.1/configure --target=mipsisa32-elf --prefix=/home/msieweke/gnutools_321 --enable-languages=c,c++ --enable-gofast --with-gnu-as --with-gnu-ld --with-newlib --with-gxx-include-dir=/home/msieweke/gnutools_321/mipsisa32-elf/include -v Thread model: single gcc version 3.2.1
GCC 3.2.1 is no longer maintained, please reproduce with at least GCC 4.3.3.
As mentioned in the original report, the bug doesn't exist in GCC 4.x.x. It has since been tested with GCC 3.4.4, where the bug is fixed. GCC 3.2.x - broken GCC 3.3.x - broken GCC 3.4.x - fixed GCC 4.x.x - fixed For a number of reasons, we're stuck using GCC 3.2.1 with only minor updates. I tried porting parts of the MIPS code generator from 3.4.4 into 3.2.1, but this is a larger project than it appears. I don't expect anyone to spend much time fixing this, but I would appreciate a hint about how I might approach a fix.
Try bisecting the changes to cherry-pick the one fixing the bug. Fixed in GCC 3.4.