[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