Bug 39566 - Optimization fails on templated iteration function
Summary: Optimization fails on templated iteration function
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.3.1
: P3 normal
Target Milestone: 4.3.2
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-03-27 07:24 UTC by Mark Rohrbacher
Modified: 2009-03-27 12:58 UTC (History)
1 user (show)

See Also:
Host: i686-suse-linux
Target: i586-suse-linux
Build:
Known to work: 4.3.2
Known to fail: 4.3.1
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mark Rohrbacher 2009-03-27 07:24:10 UTC
I tried to reduce the code to a minimum, so the example does no longer make sense at all.
However, the point is, that the code is supposed to return half the count of elements in a container (e.g. if the container holds 16 elements, the function would return 16, if it holds 33 elements, the function would still return 16). Compiled with -O0, things are alright. Using -O1 or -O2 breaks it and the function returns 15 for a container with 32 elements.
Compiling with -DWORKS_OK, omitting the template, everything is fine.


mrohrbac@linux-5tx5:~/test> uname -a
Linux linux-5tx5 2.6.27-rc3-g8d0968ab-24-pae #8d0968abd03ec6b407df117adc773562386702fa SMP 2008/24/14 00:24:3 i686 i686 i386 GNU/Linux

mrohrbac@linux-5tx5:~/test> cat test.cxx
#include <string>

#ifdef WORKS_OK
typedef std::string::iterator II;
#else
template<typename II>
#endif
size_t test(II from, II end)
{
    size_t cnt=0;
    while (from != end) {
        ++from;
        if (from == end)
            return cnt;
        ++from;
        ++cnt;
    }
    return cnt;
}

int main(int,char**)
{
  std::string s="1234567890abcdef1234567890abcdef";
  size_t cnt=test(s.begin(), s.end());
  return cnt;
}

mrohrbac@linux-5tx5:~/test> g++ -v -O1 -Wall -pedantic test.cxx
Using built-in specs.
Target: i586-suse-linux
Configured with: ../configure --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.3 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --with-slibdir=/lib --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --program-suffix=-4.3 --enable-version-specific-runtime-libs --enable-linux-futex --without-system-libunwind --with-cpu=generic --build=i586-suse-linux
Thread model: posix
gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux)
COLLECT_GCC_OPTIONS='-v' '-O1' '-Wall' '-pedantic' '-shared-libgcc' '-mtune=generic'
 /usr/lib/gcc/i586-suse-linux/4.3/cc1plus -quiet -v -D_GNU_SOURCE test.cxx -quiet -dumpbase test.cxx -mtune=generic -auxbase test -O1 -Wall -pedantic -version -o /tmp/cc0jlsQi.s
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.3
 /usr/include/c++/4.3/i586-suse-linux
 /usr/include/c++/4.3/backward
 /usr/local/include
 /usr/lib/gcc/i586-suse-linux/4.3/include
 /usr/lib/gcc/i586-suse-linux/4.3/include-fixed
 /usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/include
 /usr/include
End of search list.
GNU C++ (SUSE Linux) version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (i586-suse-linux)
        compiled by GNU C version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036], GMP version 4.2.2, MPFR version 2.3.1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 0a1ff4dd89b2c90c4ec1f432d1f05160
COLLECT_GCC_OPTIONS='-v' '-O1' '-Wall' '-pedantic' '-shared-libgcc' '-mtune=generic'
 /usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/bin/as -V -Qy -o /tmp/cc8Gof5B.o /tmp/cc0jlsQi.s
GNU assembler version 2.18.50 (i586-suse-linux) using BFD version (GNU Binutils; openSUSE 11.0) 2.18.50.20080409-11.1
COMPILER_PATH=/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/:/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/bin/
LIBRARY_PATH=/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/lib/:/usr/lib/gcc/i586-suse-linux/4.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-O1' '-Wall' '-pedantic' '-shared-libgcc' '-mtune=generic'
 /usr/lib/gcc/i586-suse-linux/4.3/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i586-suse-linux/4.3/../../../crt1.o /usr/lib/gcc/i586-suse-linux/4.3/../../../crti.o /usr/lib/gcc/i586-suse-linux/4.3/crtbegin.o -L/usr/lib/gcc/i586-suse-linux/4.3 -L/usr/lib/gcc/i586-suse-linux/4.3 -L/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/lib -L/usr/lib/gcc/i586-suse-linux/4.3/../../.. /tmp/cc8Gof5B.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/i586-suse-linux/4.3/crtend.o /usr/lib/gcc/i586-suse-linux/4.3/../../../crtn.o
Comment 1 Richard Biener 2009-03-27 09:23:57 UTC
This was fixed in GCC 4.3.2.