[Bug inline-asm/20712] New: asm code depends on position of function in the source

y_s_r at list dot ru gcc-bugzilla@gcc.gnu.org
Fri Apr 1 11:44:00 GMT 2005


The following 3 equvalent variants of the same primitive program should lead to
the same code, but they don't:

1. C source:

static inline int f1();
static inline int f2();

int main() { f1(); }
static inline int f1() { f2(); }
static inline int f2() { return 1; }

Its assembler output:

	.file	"main_1.c"
	.version	"01.01"
gcc2_compiled.:
.text
	.align 4
.globl main
	.type	 main,@function
main:
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%eax
	pushl	%eax
	leave
	jmp	f1
.Lfe1:
	.size	 main,.Lfe1-main
	.align 4
	.type	 f1,@function
f1:
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%edx
	pushl	%edx
	leave
	jmp	f2
.Lfe2:
	.size	 f1,.Lfe2-f1
	.align 4
	.type	 f2,@function
f2:
	pushl	%ebp
	movl	$1, %eax
	movl	%esp, %ebp
	popl	%ebp
	ret
.Lfe3:
	.size	 f2,.Lfe3-f2
	.ident	"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)"

2. C source:

static inline int f1();
static inline int f2();

int main() { f1(); }
static inline int f2() { return 1; }
static inline int f1() { f2(); }

Its assembler output:

	.file	"main_2.c"
	.version	"01.01"
gcc2_compiled.:
.text
	.align 4
.globl main
	.type	 main,@function
main:
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%eax
	pushl	%eax
	leave
	jmp	f1
.Lfe1:
	.size	 main,.Lfe1-main
	.align 4
	.type	 f1,@function
f1:
	pushl	%ebp
	movl	%esp, %ebp
	popl	%ebp
	ret
.Lfe2:
	.size	 f1,.Lfe2-f1
	.ident	"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)"

3. C source:

static inline int f1();
static inline int f2();

static inline int f2() { return 1; }
static inline int f1() { f2(); }
int main() { f1(); }

Its assembler output:

	.file	"main_3.c"
	.version	"01.01"
gcc2_compiled.:
.text
	.align 4
.globl main
	.type	 main,@function
main:
	pushl	%ebp
	movl	%esp, %ebp
	popl	%ebp
	ret
.Lfe1:
	.size	 main,.Lfe1-main
	.ident	"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)"

In the C code automatically generated by the nesC compiler such a situation
leads to significant missing of optimization for size.

-- 
           Summary: asm code depends on position of function in the source
           Product: gcc
           Version: 2.96
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P2
         Component: inline-asm
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: y_s_r at list dot ru
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux
  GCC host triplet: i686-pc-linux
GCC target triplet: i686-pc-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20712



More information about the Gcc-bugs mailing list