[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