[Bug optimization/15036] New: [3.4 regression] Performance and code size regression compared to 3.3

martin at mpa-garching dot mpg dot de gcc-bugzilla@gcc.gnu.org
Wed Apr 21 10:00:00 GMT 2004


When compiling the following code:

template<typename T> class xcomplex
  {
  public:
    T re, im;

    xcomplex (const T &re_, const T &im_)
      : re(re_), im(im_) {}
    template<typename U> xcomplex (const xcomplex<U> &orig)
      : re(orig.re), im(orig.im) {}
    xcomplex operator* (const T &fact) const
      { return xcomplex (re*fact,im*fact); }
  };

void foo (xcomplex<double> *a, double *b, xcomplex<double> *c)
  {
  for (int m=0; m<1000; ++m)
    c[m]=a[m]*b[m];
  }


g++ 3.4 produces bigger (and slower) code than 3.3:

~/tmp>g++ -O2 -S -v perf.cc
Reading specs from
/afs/mpa/common/pdsoft/appl/gcc-3.3.2/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/specs
Configured with: /scratch/gcc-3.3.2/configure
--prefix=/afs/mpa/common/pdsoft/appl/gcc-3.3.2 --enable-languages=c++
--disable-checking
Thread model: posix
gcc version 3.3.2
 /afs/mpa/common/pdsoft/appl/gcc-3.3.2/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/cc1plus
-quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=2 -D_GNU_SOURCE
perf.cc -D__GNUG__=3 -quiet -dumpbase perf.cc -auxbase perf -O2 -version -o perf.s
GNU C++ version 3.3.2 (i686-pc-linux-gnu)
        compiled by GNU C version 3.3.2.
GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=63318
ignoring nonexistent directory
"/afs/mpa/common/pdsoft/appl/gcc-3.3.2/i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /afs/mpa/common/pdsoft/appl/gcc-3.3.2/include/c++/3.3.2
 /afs/mpa/common/pdsoft/appl/gcc-3.3.2/include/c++/3.3.2/i686-pc-linux-gnu
 /afs/mpa/common/pdsoft/appl/gcc-3.3.2/include/c++/3.3.2/backward
 /usr/local/include
 /afs/mpa/common/pdsoft/appl/gcc-3.3.2/include
 /afs/mpa/common/pdsoft/appl/gcc-3.3.2/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include
 /usr/include
End of search list.

~/tmp>cat perf.s
        .file   "perf.cc"
        .text
        .align 2
        .p2align 4,,15
.globl _Z3fooP8xcomplexIdEPdS1_
        .type   _Z3fooP8xcomplexIdEPdS1_, @function
_Z3fooP8xcomplexIdEPdS1_:
.LFB10:
        pushl   %ebp
.LCFI0:
        movl    %esp, %ebp
.LCFI1:
        pushl   %edi
.LCFI2:
        pushl   %esi
.LCFI3:
        xorl    %esi, %esi
        pushl   %ebx
.LCFI4:
        subl    $28, %esp
.LCFI5:
        movl    8(%ebp), %edi
        movl    16(%ebp), %ebx
        movl    12(%ebp), %ecx
        .p2align 4,,15
.L8:
        fldl    (%ecx)
        movl    %esi, %edx
        sall    $4, %edx
        leal    (%edx,%edi), %eax
        incl    %esi
        addl    $8, %ecx
        fldl    (%eax)
        cmpl    $999, %esi
        fmul    %st(1), %st
        fxch    %st(1)
        fmull   8(%eax)
        fxch    %st(1)
        fstpl   -40(%ebp)
        movl    -40(%ebp), %eax
        fstpl   -32(%ebp)
        movl    %eax, (%ebx,%edx)
        movl    -36(%ebp), %eax
        movl    %eax, 4(%ebx,%edx)
        movl    -32(%ebp), %eax
        movl    %eax, 8(%ebx,%edx)
        movl    -28(%ebp), %eax
        movl    %eax, 12(%ebx,%edx)
        jle     .L8
        addl    $28, %esp
        popl    %ebx
        popl    %esi
        popl    %edi
        popl    %ebp
        ret
.LFE10:
        .size   _Z3fooP8xcomplexIdEPdS1_, .-_Z3fooP8xcomplexIdEPdS1_
        .ident  "GCC: (GNU) 3.3.2"


~/tmp>g++ -O2 -S -v perf.cc
Reading specs from /afs/mpa/data/martin/ugcc34/lib/gcc/i686-pc-linux-gnu/3.4.0/specs
Configured with: /scratch/gcc34/configure --prefix=/afs/mpa/data/martin/ugcc34
--enable-languages=c++ --disable-checking
Thread model: posix
gcc version 3.4.0 20040418 (prerelease)
 /afs/mpa/data/martin/ugcc34/libexec/gcc/i686-pc-linux-gnu/3.4.0/cc1plus -quiet
-v -D_GNU_SOURCE perf.cc -quiet -dumpbase perf.cc -mtune=pentiumpro -auxbase
perf -O2 -version -o perf.s
ignoring nonexistent directory
"/afs/mpa/data/martin/ugcc34/lib/gcc/i686-pc-linux-gnu/3.4.0/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /afs/mpa/data/martin/ugcc34/lib/gcc/i686-pc-linux-gnu/3.4.0/../../../../include/c++/3.4.0
 /afs/mpa/data/martin/ugcc34/lib/gcc/i686-pc-linux-gnu/3.4.0/../../../../include/c++/3.4.0/i686-pc-linux-gnu
 /afs/mpa/data/martin/ugcc34/lib/gcc/i686-pc-linux-gnu/3.4.0/../../../../include/c++/3.4.0/backward
 /usr/local/include
 /afs/mpa/data/martin/ugcc34/include
 /afs/mpa/data/martin/ugcc34/lib/gcc/i686-pc-linux-gnu/3.4.0/include
 /usr/include
End of search list.
GNU C++ version 3.4.0 20040418 (prerelease) (i686-pc-linux-gnu)
        compiled by GNU C version 3.4.0 20040418 (prerelease).
GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=63318


~/tmp>cat perf.s
        .file   "perf.cc"
        .text
        .align 2
        .p2align 4,,15
.globl _Z3fooP8xcomplexIdEPdS1_
        .type   _Z3fooP8xcomplexIdEPdS1_, @function
_Z3fooP8xcomplexIdEPdS1_:
.LFB5:
        pushl   %ebp
.LCFI0:
        movl    %esp, %ebp
.LCFI1:
        pushl   %edi
.LCFI2:
        pushl   %esi
.LCFI3:
        pushl   %ebx
.LCFI4:
        subl    $60, %esp
.LCFI5:
        movl    16(%ebp), %edi
        movl    $0, -60(%ebp)
        movl    12(%ebp), %esi
        .p2align 4,,15
.L7:
        fldl    (%esi)
        addl    $8, %esi
        movl    -60(%ebp), %edx
        incl    -60(%ebp)
        movl    8(%ebp), %ecx
        sall    $4, %edx
        cmpl    $999, -60(%ebp)
        leal    (%edx,%ecx), %eax
        fldl    (%eax)
        fmul    %st(1), %st
        fxch    %st(1)
        fmull   8(%eax)
        fxch    %st(1)
        fstpl   -56(%ebp)
        movl    -56(%ebp), %ebx
        movl    -52(%ebp), %ecx
        fstpl   -48(%ebp)
        movl    -48(%ebp), %eax
        movl    %ebx, -40(%ebp)
        movl    %ecx, -36(%ebp)
        movl    %eax, -32(%ebp)
        movl    -44(%ebp), %eax
        movl    %eax, -28(%ebp)
        movl    %ebx, (%edx,%edi)
        movl    %ecx, 4(%edx,%edi)
        movl    -32(%ebp), %eax
        movl    %eax, 8(%edx,%edi)
        movl    -28(%ebp), %eax
        movl    %eax, 12(%edx,%edi)
        jle     .L7
        addl    $60, %esp
        popl    %ebx
        popl    %esi
        popl    %edi
        popl    %ebp
        ret
.LFE5:
        .size   _Z3fooP8xcomplexIdEPdS1_, .-_Z3fooP8xcomplexIdEPdS1_
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.0 20040418 (prerelease)"


The assembler generated by g++ 3.4 contains more movl statements inside the
loop.
This problem is also present on mainline.

-- 
           Summary: [3.4 regression] Performance and code size regression
                    compared to 3.3
           Product: gcc
           Version: 3.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: martin at mpa-garching dot mpg dot de
                CC: gcc-bugs at gcc dot gnu dot org,martin at mpa-garching
                    dot mpg dot de
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15036



More information about the Gcc-bugs mailing list