The following code produces a redundant "movzwl": typedef unsigned short u16; typedef unsigned int u32;
u32 a(volatile u16* off) { return *off; } u32 b(u16* off) { return *off; } compiled with mingw32-gcc-4.3.0.exe -c -O2 -fomit-frame-pointer -mtune=core2 test.c it produces: 00000000 <_a>: 0: 8b 44 24 04 mov 0x4(%esp),%eax 4: 0f b7 00 movzwl (%eax),%eax 7: 0f b7 c0 movzwl %ax,%eax a: c3 ret 00000010 <_b>: 10: 8b 44 24 04 mov 0x4(%esp),%eax 14: 0f b7 00 movzwl (%eax),%eax 17: c3 ret I also saw this behavior in Ubuntu 7.10 using gcc 4.1.3 complete version of used gcc: mingw32-gcc-4.3.0.exe -v Using built-in specs. Target: mingw32 Configured with: ../gcc-4.3.0/configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++ --disable-sjlj-exceptions --enable-shared --enable-libgcj --enable-libgomp --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-concept-checks --enable-version-specific-runtime-libs --build=mingw32 --with-bugurl=http://www.mingw.org/bugs.shtml --prefix=/mingw --with-gmp=/mingw/src/gcc/gmp-mpfr-root --with-mpfr=/mingw/src/gcc/gmp-mpfr-root --with-libiconv-prefix=/mingw/src/gcc/libiconv-root Thread model: win32 gcc version 4.3.0 20080305 (alpha-testing) mingw-20080502 (GCC) -- Summary: redundant movzwl for volatile unsigned short load Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: MatthiasMann at gmx dot de GCC host triplet: Microsoft Windows XP [Version 5.1.2600] GCC target triplet: mingw32 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36873