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

Reply via email to