It seems the optimizer does not cope with the high bit set in unsigned int arrays and does not find the max element in an array. Test case (fails with -O3 and with gcc 4.3 or gcc 4.4).
#include <stdio.h> #include <assert.h> unsigned int g(const unsigned int* p, int n) { unsigned int max1 = 0; const unsigned int* q, *qend; for (q = p, qend=p+n; q!=qend; ++q) { if (*q>max1) {max1=*q;} } return max1; } int main() { unsigned int arr[8] = {0}, max; arr[0] = 255u*255u*255u*255u; max = g(arr, 8); printf("max: %u\n", max); assert(max==arr[0]); return 0; } held...@nehalemex:~> gcc -O3 minmaxbug.c held...@nehalemex:~> ./a.out max: 0 a.out: minmaxbug.c:18: main: Assertion `max==arr[0]' failed. Aborted held...@nehalemex:~> gcc -v Using built-in specs. Target: x86_64-suse-linux Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.4 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=generic --build=x86_64-suse-linux Thread model: posix gcc version 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux) -- Summary: Finding max element in an unsigned int array fails with -O3 Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: major Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: paavo at osa dot pri dot ee GCC build triplet: x86_64-suse-linux GCC host triplet: x86_64-suse-linux GCC target triplet: x86_64-suse-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44801