[Bug c++/16352] New: [g++] compile-time const ptr-to-member weakly optimized
smelkov at mph1 dot phys dot spbu dot ru
gcc-bugzilla@gcc.gnu.org
Sat Jul 3 18:01:00 GMT 2004
I discovered a situation where compile-time const pointer-to-member functions
are not well optimized.
Below is a code snippet that demonstrates such situation. With robus optimizer one would
expect direct_assign, set_assign and memptr_assign to be compiled to the exact same small
(as it is for direct_assign and set_assign) piece of code.
However, as assembler dump demonstrates, memptr_assign is weakly optimized.
--- memptr_weak_opt.cpp ---
struct A
{
int __x;
inline void set_x(int val)
{ __x = val; }
};
void direct_assign(A& a)
{ a.__x = 2; }
void set_assign(A& a)
{ a.set_x(2); }
static void (A::* const set)(int) = &A::set_x;
void memptr_assign(A& a)
{ (a.*set)(2); }
---------
[kirr@roro weak_opt]$ /mnt/tmini/kirr/local/gcc-3.4.1-nocheck/bin/g++ -S -Wall -O3
-fverbose-asm -fno-exceptions -fomit-frame-pointer -funit-at-a-time memptr_weak_opt.cpp
--- memptr_weak_opt.s ---
.file "memptr_weak_opt.cpp"
# GNU C++ version 3.4.1 (i686-pc-linux-gnu)
# compiled by GNU C version 3.4.1.
# GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=32160
# options passed: -D_GNU_SOURCE -march=pentium2 -auxbase -O3 -Wall
# -fverbose-asm -fno-exceptions -fomit-frame-pointer -funit-at-a-time
# options enabled: -feliminate-unused-debug-types -fdefer-pop
# -fomit-frame-pointer -foptimize-sibling-calls -funit-at-a-time
# -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations
# -fthread-jumps -fstrength-reduce -funswitch-loops -fpeephole -fforce-mem
# -ffunction-cse -fkeep-static-consts -fcaller-saves -fpcc-struct-return
# -fweb -fgcse -fgcse-lm -fgcse-sm -fgcse-las -floop-optimize
# -fcrossjumping -fif-conversion -fif-conversion2 -frerun-cse-after-loop
# -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns2
# -fsched-interblock -fsched-spec -fsched-stalled-insns
# -fsched-stalled-insns-dep -fbranch-count-reg -freorder-blocks
# -freorder-functions -frename-registers -fcprop-registers -fcommon
# -fverbose-asm -fregmove -foptimize-register-move -fargument-alias
# -fstrict-aliasing -fmerge-constants -fzero-initialized-in-bss -fident
# -fpeephole2 -fguess-branch-probability -fmath-errno -ftrapping-math
# -m80387 -mhard-float -mno-soft-float -mieee-fp -mfp-ret-in-387
# -maccumulate-outgoing-args -mmmx -mno-red-zone -mtls-direct-seg-refs
# -mtune=pentium2 -march=pentium2
.section .rodata
.align 4
.type set, @object
.size set, 8
set:
# __pfn:
.long A::set_x(int)
# __delta:
.long 0
.section .gnu.linkonce.t._ZN1A5set_xEi,"ax",@progbits
.align 2
.p2align 4,,15
.weak A::set_x(int)
.type A::set_x(int), @function
A::set_x(int):
movl 8(%esp), %edx # val, val
movl 4(%esp), %eax # this, this
movl %edx, (%eax) # val, <variable>.__x
ret
.size A::set_x(int), .-A::set_x(int)
.text
.align 2
.p2align 4,,15
.globl direct_assign(A&)
.type direct_assign(A&), @function
direct_assign(A&):
movl 4(%esp), %eax # a, a
movl $2, (%eax) #, <variable>.__x
ret
.size direct_assign(A&), .-direct_assign(A&)
.align 2
.p2align 4,,15
.globl set_assign(A&)
.type set_assign(A&), @function
set_assign(A&):
movl 4(%esp), %eax # a, a
movl $2, (%eax) #, <variable>.__x
ret
.size set_assign(A&), .-set_assign(A&)
.align 2
.p2align 4,,15
.globl memptr_assign(A&)
.type memptr_assign(A&), @function
memptr_assign(A&):
pushl %ebx #
subl $8, %esp #,
movl set, %edx # set.__pfn, set.__pfn
movl 16(%esp), %ebx # a, a
testb $1, %dl #, set.__pfn
jne .L6 #,
movl set+4, %ecx # set.__delta, set.__delta
movl $2, %eax #,
movl %eax, 4(%esp) #,
leal (%ebx,%ecx), %eax #, tmp70
movl %eax, (%esp) # tmp70,
call *%edx # set.__pfn
addl $8, %esp #,
popl %ebx #
ret
.p2align 4,,7
.L6:
movl set+4, %ecx # set.__delta, set.__delta
movl (%ebx,%ecx), %eax #* set.__delta, tmp66
movl -1(%eax,%edx), %edx #, set.__pfn
movl $2, %eax #,
movl %eax, 4(%esp) #,
leal (%ebx,%ecx), %eax #, tmp70
movl %eax, (%esp) # tmp70,
call *%edx # set.__pfn
addl $8, %esp #,
popl %ebx #
ret
.size memptr_assign(A&), .-memptr_assign(A&)
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.1"
---------
[kirr@roro weak_opt]$ /mnt/tmini/kirr/local/gcc-3.4.1-nocheck/bin/g++ -v
Reading specs from
/mnt/tmini/kirr/local/gcc-3.4.1-nocheck/lib/gcc/i686-pc-linux-gnu/3.4.1/specs
Configured with: ../gcc-3.4.1/configure --prefix=/mnt/tmini/kirr/local/gcc-3.4.1-nocheck
--with-gnu-as --with-gnu-ld --enable-threads=posix --with-arch=pentium2 --with-tune=pentium2
--enable-__cxa_atexit --enable-languages=c,c++,f77,ada --disable-checking --disable-nls
Thread model: posix
gcc version 3.4.1
--
Summary: [g++] compile-time const ptr-to-member weakly optimized
Product: gcc
Version: 3.4.1
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: smelkov at mph1 dot phys dot spbu dot ru
CC: gcc-bugs at gcc dot gnu dot org
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=16352
More information about the Gcc-bugs
mailing list