oopack performance

Dan Nicolaescu dann@ics.uci.edu
Tue May 6 17:44:00 GMT 2003


Joe Buck <jbuck@synopsys.com> writes:

  > On Tue, May 06, 2003 at 06:28:54AM -0700, Dan Nicolaescu wrote:
  > > Mainline GCC performs well for the 3 of the 4 oopack benchmarks. 
  > > The only exception is "Complex". 
  > > ...
  > 
  > > The performance can be improved dramatically by just adding a
  > > constructor to the "Complex" class:
  > > 
  > > Complex (const Complex &F) : re(F.re), im(F.im) {}
  > 
  > This is very odd, because that's pretty much the same as the
  > default compiler-generated constructor.  Anyone have any idea
  > why there's so much difference?

Something is strange about the compiler generated constructor.

Given:

class Complex {
public:
    int re, im;
    Complex( int r, int i ) : re(r), im(i) {}
#ifdef MYCONSTRUCTOR
    Complex( const Complex & F ) : re(F.re), im(F.im) {}
#endif
    Complex() {}
};

Complex Yy;

void oop_style()
{
  Complex factor (53, 37);
  Yy = factor;
}

The oop_style function is compiled to: 

_Z9oop_stylev:
.LFB11:
        subl    $12, %esp       #,
.LCFI0:
        movl    $53, (%esp)     #,
        movl    (%esp), %edx    #, tmp64
        movl    $37, 4(%esp)    #, <variable>.im
        movl    4(%esp), %ecx   #,
        movl    %edx, Yy        # tmp64,
        movl    %ecx, Yy+4      #,
        addl    $12, %esp       #,
        ret

when using g++ -O3   -fverbose-asm -fomit-frame-pointer

and to:

_Z9oop_stylev:
.LFB14:
        subl    $28, %esp       #,
.LCFI0:
        movl    $53, %eax       #,
        movl    $37, %edx       #,
        movl    %eax, Yy        #,
        movl    %edx, Yy+4      #,
        addl    $28, %esp       #,
        ret


when using g++ -O3 -DMYCONSTRUCTOR  -fverbose-asm -fomit-frame-pointer

Node the extra move to the stack when using the compiler generated
constructor. 
Maybe this will help somebody figure what is going on.



More information about the Gcc mailing list