With -O2, the source code below takes too much time (about 20s) to compile. If I change the typedef as follows, compile finishes instantly. - typedef BigTerm<30> term_t; + typedef BigTerm<29> term_t; I tried to shorten the code as short as possible, so changing almost any part of it will cause the problem to disappear.
Thanks, Shuhei $ cat g++-stall.cpp template<int N> struct BigTerm { int lo; BigTerm<N-1> hi; BigTerm() {} BigTerm(int lo, const BigTerm<N-1>& hi) : lo(lo), hi(hi) {} bool any() { return (lo || hi.any()); } BigTerm zero() { return BigTerm(0, BigTerm<N-1>()); } }; template<> struct BigTerm<1> { int u; BigTerm() {} BigTerm(const BigTerm& rhs) : u(rhs.u) {} bool any() { return 0; } }; typedef BigTerm<30> term_t; struct TermBase { term_t obj; term_t get() { return obj; } }; struct virtual_reference { TermBase base; virtual void filter() { for(int i = 0; i < 10; i++) { base.get().any(); } } }; void f() { term_t a; a.zero(); new virtual_reference(); } $ time g++ -O2 -c -v g++-stall.cpp Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1.1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-cld --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.3.2 (Debian 4.3.2-1.1) COLLECT_GCC_OPTIONS='-O2' '-c' '-v' '-shared-libgcc' '-mtune=generic' /usr/lib/gcc/x86_64-linux-gnu/4.3.2/cc1plus -quiet -v -D_GNU_SOURCE g++-stall.cpp -quiet -dumpbase g++-stall.cpp -mtune=generic -auxbase g++-stall -O2 -version -o /tmp/ccqqIC5b.s ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../x86_64-linux-gnu/include" ignoring nonexistent directory "/usr/include/x86_64-linux-gnu" #include "..." search starts here: #include <...> search starts here: /usr/include/c++/4.3 /usr/include/c++/4.3/x86_64-linux-gnu /usr/include/c++/4.3/backward /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.3.2/include /usr/lib/gcc/x86_64-linux-gnu/4.3.2/include-fixed /usr/include End of search list. GNU C++ (Debian 4.3.2-1.1) version 4.3.2 (x86_64-linux-gnu) compiled by GNU C version 4.3.2, GMP version 4.2.2, MPFR version 2.3.2. warning: MPFR header version 2.3.2 differs from library version 2.3.1. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 836c9d30f580c422b521aa9b7a9bf559 COLLECT_GCC_OPTIONS='-O2' '-c' '-v' '-shared-libgcc' '-mtune=generic' as -V -Qy -o g++-stall.o /tmp/ccqqIC5b.s GNU assembler version 2.18.0 (x86_64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.18.0.20080103 COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.3.2/:/usr/lib/gcc/x86_64-linux-gnu/4.3.2/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.3.2/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.3.2/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.3.2/:/usr/lib/gcc/x86_64-linux-gnu/4.3.2/:/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-O2' '-c' '-v' '-shared-libgcc' '-mtune=generic' g++ -O2 -c -v g++-stall.cpp 20.30s user 0.01s system 99% cpu 20.328 total -- Summary: it takes too much time to compile using -O2 Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: gcc-bugzilla at m dot nya3 dot jp GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40230