Skip to contentSkip to conversation

allow gcc4 to control inlining

PATCH In review Ingo Molnar 5 participants 8 messages Dec 28, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 allow gcc4 to control inlining

allow gcc4 compilers to decide what to inline and what not - instead of the kernel forcing gcc to inline all the time.

----

 include/linux/compiler-gcc4.h |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)
include/linux/compiler-gcc4.h +5 -4
Index: linux/include/linux/compiler-gcc4.h
===================================================================
@@ -3,14 +3,15 @@
 /* These definitions are for GCC v4.x.  */
 #include <linux/compiler-gcc.h>
 
-#define inline			inline		__attribute__((always_inline))
-#define __inline__		__inline__	__attribute__((always_inline))
-#define __inline		__inline	__attribute__((always_inline))
+#define inline			inline
+#define __inline__		__inline__
+#define __inline		__inline
 #define __deprecated		__attribute__((deprecated))
 #define __attribute_used__	__attribute__((__used__))
 #define __attribute_pure__	__attribute__((pure))
 #define __attribute_const__	__attribute__((__const__))
-#define  noinline		__attribute__((noinline))
+#define noinline		__attribute__((noinline))
+#define __always_inline		inline __attribute__((always_inline))
 #define __must_check 		__attribute__((warn_unused_result))
 #define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
 
Acked-by on v1 1/2
#1 lore raw
Quoted 5 lines · Ingo Molnar

allow gcc4 compilers to decide what to inline and what not - instead of the kernel forcing gcc to inline all the time.

I'm ever so slightly wary of GCC 4's stack size logic for functions with nested scopes, but I think we'll have no trouble catching any trouble cases in 2.6.16-rc.

Signature · 1 line
Mathematics is the supreme nostalgia of our time.
#2 lore raw
Quoted 4 lines · Matt Mackall
Quoted 3 lines · Ingo Molnar

allow gcc4 compilers to decide what to inline and what not - instead of the kernel forcing gcc to inline all the time.

Quoted 8 lines
Quoted 2 lines

I'm ever so slightly wary of GCC 4's stack size logic for functions with nested scopes, but I think we'll have no trouble catching any trouble cases in 2.6.16-rc.

FYI, the max function-frame size did not change, so there's no outrageous frames like with gcc3, just a small shift upwards.

Ingo

#3 lore raw
Quoted 10 lines · Ingo Molnar
Quoted 7 lines · Matt Mackall
Quoted 5 lines · Ingo Molnar

allow gcc4 compilers to decide what to inline and what not - instead of the kernel forcing gcc to inline all the time.

Quoted 8 lines
Quoted 5 lines

I'm ever so slightly wary of GCC 4's stack size logic for functions with nested scopes, but I think we'll have no trouble catching any trouble cases in 2.6.16-rc.

FYI, the max function-frame size did not change, so there's no outrageous frames like with gcc3, just a small shift upwards.

My point is more that I wouldn't be surprised if we found a corner case for a particular .config. But even with GCC 3 and 4k stacks, automatic inlining worked just fine for most configs after killing just a few offenders.

Signature · 1 line
Mathematics is the supreme nostalgia of our time.
#4 lore raw
In reply to Ingo Molnar

include/linux/compiler-gcc4.h line 8

Quoted 3 lines
include/linux/compiler-gcc4.h +0 -3
-#define inline			inline		__attribute__((always_inline))
-#define __inline__		__inline__	__attribute__((always_inline))
-#define __inline		__inline	__attribute__((always_inline))

Why not just delete these lines? This:

include/linux/compiler-gcc4.h line 8

Quoted 3 lines
include/linux/compiler-gcc4.h +3 -0
+#define inline			inline
+#define __inline__		__inline__
+#define __inline		__inline

seems pointless to me.

- R.

#5 lore raw
Quoted 11 lines · Roland Dreier

Review

Quoted 3 lines
(quoted diff) +0 -3
-#define inline			inline		__attribute__((always_inline))
-#define __inline__		__inline__	__attribute__((always_inline))
-#define __inline		__inline	__attribute__((always_inline))

Why not just delete these lines? This:

Review

Quoted 3 lines
(quoted diff) +3 -0
+#define inline			inline
+#define __inline__		__inline__
+#define __inline		__inline

seems pointless to me.

indeed. I thought they were redefined to a default if not defined, but that's only the case for __always_inline. Updated patch below.

Ingo

--------
Subject: allow gcc4 to control inlining

allow gcc4 compilers to decide what to inline and what not - instead of the kernel forcing gcc to inline all the time.

----

 include/linux/compiler-gcc4.h |    6 ++----
 1 files changed, 2 insertions(+), 4 deletions(-)
include/linux/compiler-gcc4.h +2 -4
Index: linux/include/linux/compiler-gcc4.h
===================================================================
@@ -3,14 +3,12 @@
 /* These definitions are for GCC v4.x.  */
 #include <linux/compiler-gcc.h>
 
-#define inline			inline		__attribute__((always_inline))
-#define __inline__		__inline__	__attribute__((always_inline))
-#define __inline		__inline	__attribute__((always_inline))
 #define __deprecated		__attribute__((deprecated))
 #define __attribute_used__	__attribute__((__used__))
 #define __attribute_pure__	__attribute__((pure))
 #define __attribute_const__	__attribute__((__const__))
-#define  noinline		__attribute__((noinline))
+#define noinline		__attribute__((noinline))
+#define __always_inline		inline __attribute__((always_inline))
 #define __must_check 		__attribute__((warn_unused_result))
 #define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
 
#6 lore raw
In reply to Ingo Molnar

include/linux/compiler-gcc4.h line 16

Quoted 7 lines · Ingo Molnar

allow gcc4 compilers to decide what to inline and what not - instead of the kernel forcing gcc to inline all the time.

include/linux/compiler-gcc4.h +2 -0
+#define noinline		__attribute__((noinline))
+#define __always_inline		inline __attribute__((always_inline))
 #define __must_check 		__attribute__((warn_unused_result))
 #define __compiler_offsetof(a,b) __builtin_offsetof(a,b)

You seem to be missing the rest of the patch - namely, addition of always_inline where it is needed now...

Note that we *do* need it in quite a few places. Anything that relies on dead code elimination to kill a call of function that doesn't exist would better be always inlined...

#7 lore raw
Quoted 12 lines · Al Viro

include/linux/compiler-gcc4.h line 16

Quoted 7 lines · Ingo Molnar

allow gcc4 compilers to decide what to inline and what not - instead of the kernel forcing gcc to inline all the time.

include/linux/compiler-gcc4.h +2 -0
+#define noinline		__attribute__((noinline))
+#define __always_inline		inline __attribute__((always_inline))
 #define __must_check 		__attribute__((warn_unused_result))
 #define __compiler_offsetof(a,b) __builtin_offsetof(a,b)

You seem to be missing the rest of the patch - namely, addition of always_inline where it is needed now...

Quoted 3 lines

Note that we *do* need it in quite a few places. Anything that relies on dead code elimination to kill a call of function that doesn't exist would better be always inlined...

on x86-64 that seems to only be fix_to_virt though.. so it's really not that many.

(based on making "inline" a define for noinline and then an allyesconfig)