[Bug c++/47671] New: Missed optimization on empty virtual destructors
jyasskin at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Feb 9 22:24:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47671
Summary: Missed optimization on empty virtual destructors
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: jyasskin@gcc.gnu.org
At the beginning of each virtual destructor gcc writes the address of the
current class's vtable into the object's vptr. However, if the destructor is
empty, it doesn't need to do this, since after the return or delete call, the
object is dead, and any read of the vptr is undefined behavior..
Given:
$ cat test.cc
struct Base {
virtual ~Base() {}
};
struct Derived : Base {
~Derived();
};
Derived::~Derived() {}
gcc-4.6 produces:
$ gcc-4.6svn -O3 -S -fverbose-asm test.cc -o -
...
.globl _ZN7DerivedD2Ev
.type _ZN7DerivedD2Ev, @function
_ZN7DerivedD2Ev:
movq $_ZTV4Base+16, (%rdi) #, MEM[(struct Base
*)this_1(D)]._vptr.Base
ret
...
.globl _ZN7DerivedD0Ev
.type _ZN7DerivedD0Ev, @function
_ZN7DerivedD0Ev:
movq $_ZTV4Base+16, (%rdi) #, MEM[(struct Base
*)this_1(D)]._vptr.Base
jmp _ZdlPv #
In PIC mode, this is 3 instructions instead of one:
$ gcc-4.6svn -fPIC -O3 -S -fverbose-asm test.cc -o -
...
_ZN7DerivedD2Ev:
movq _ZTV4Base@GOTPCREL(%rip), %rax #, tmp63
addq $16, %rax #, tmp62
movq %rax, (%rdi) # tmp62, MEM[(struct Base
*)this_1(D)]._vptr.Base
ret
More information about the Gcc-bugs
mailing list