[Bug c/54123] New: inline functions not optimized as well as static inline
eggert at gnu dot org
gcc-bugzilla@gcc.gnu.org
Sun Jul 29 21:06:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54123
Bug #: 54123
Summary: inline functions not optimized as well as static
inline
Classification: Unclassified
Product: gcc
Version: 4.7.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: eggert@gnu.org
Host: x86_64-unknown-linux-gnu
Target: x86_64-unknown-linux-gnu
Build: x86_64-unknown-linux-gnu
Created attachment 27891
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=27891
test case source code
GCC does not optimize a function declared 'inline' as well as it
optimizes the same function declared 'static inline'. There is no
reason to optimize differently depending on whether an inline function
is static.
I discovered this problem when using GCC 4.7.1 to compile a test
version of GNU Emacs that uses extern inline functions.
This is a regression from GCC 4.6.3, which optimizes equally well in
both cases.
I enclose a small example of the problem. With GNU Emacs I found many
more like this, and the size of the GNU Emacs text segment grew by
0.9% when compiled to use extern inline rather than static inline
functions.
To reproduce the problem, process the attached program xml-bug1.c as
follows. (I'll also attach xml-static-inline.s and xml-inline.s.)
gcc -std=gnu99 -O2 -S -DINLINE='static inline' -o xml-static-inline.s
xml-bug1.c
gcc -std=gnu99 -O2 -S -DINLINE='inline' -o xml-inline.s xml-bug1.c
diff -u xml-static-inline.s xml-inline.s
The diff output will read as follows. Notice that xml-inline.s
contains an extra instruction 'cmpq Qnil(%rip), %r12' that
xml-static-inline.s does not. The code is correct, but it's not
optimized as well as it should be.
--- xml-static-inline.s 2012-07-29 13:39:24.254184691 -0700
+++ xml-inline.s 2012-07-29 13:49:01.555043179 -0700
@@ -238,6 +238,7 @@
.L40:
cmpq Qnil(%rip), %r12
je .L51
+.L69:
movq %r12, %rax
movq Qstringp(%rip), %rdi
andl $7, %eax
@@ -342,13 +343,8 @@
ret
.p2align 4,,10
.p2align 3
-.L51:
- .cfi_restore_state
- movl $.LC1, %r13d
- jmp .L41
- .p2align 4,,10
- .p2align 3
.L68:
+ .cfi_restore_state
movq %r12, %rdi
call xmlDocGetRootElement
testq %rax, %rax
@@ -363,8 +359,14 @@
movq %rsi, %rdi
movq %rsi, 8(%rsp)
call move_gap
+ cmpq Qnil(%rip), %r12
movq 8(%rsp), %rsi
- jmp .L40
+ jne .L69
+ .p2align 4,,10
+ .p2align 3
+.L51:
+ movl $.LC1, %r13d
+ jmp .L41
.L66:
movq %rax, %rdx
jmp .L45
More information about the Gcc-bugs
mailing list