From: Daniel Santos <daniel.santos@pobox.com>
To: Andrew Morton <akpm@linux-foundation.org>,
Christopher Li <sparse@chrisli.org>,
Daniel Santos <daniel.santos@pobox.com>,
David Daney <david.daney@cavium.com>,
David Howells <dhowells@redhat.com>,
David Rientjes <rientjes@google.com>,
Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>,
"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
Ingo Molnar <mingo@kernel.org>, Joe Perches <joe@perches.com>,
Konstantin Khlebnikov <khlebnikov@openvz.org>,
linux-doc@vger.kernel.org, linux-sparse@vger.kernel.org,
LKML <linux-kernel@vger.kernel.org>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Paul Turner <pjt@google.com>, Pavel Pisa <pisa@cmp.felk.cvut.cz>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Richard Weinberger <richard@nod.at>,
Rob Landley <rob@landley.net>,
Steven Rostedt <rostedt@goodmis.org>,
Suresh Siddha <suresh.b.siddha@intel.com>
Subject: [PATCH v4 7/13] compiler{,-gcc4}.h: Introduce __flatten function attribute
Date: Fri, 22 Jun 2012 23:00:42 -0500 [thread overview]
Message-ID: <1340424048-7759-8-git-send-email-daniel.santos@pobox.com> (raw)
In-Reply-To: <1340424048-7759-1-git-send-email-daniel.santos@pobox.com>
For gcc 4.1 & later, expands to __attribute__((flatten)) which forces
the compiler to inline everything it can into the function. This is
useful in combination with noinline when you want to control the depth
of inlining, or create a single function where inline expansions will
occur. (see
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bflatten_007d-function-attribute-2512)
Normally, it's best to leave this type of thing up to the compiler.
However, the generic rbtree code uses inline functions just to be able
to inject compile-time constant data that specifies how the caller wants
the function to behave (via struct rb_relationship). This data can be
thought of as the template parameters of a C++ templatized function.
Since some of these functions, once expanded, become quite large, gcc
sometimes decides not to perform some important inlining, in one case,
even generating a few bytes more code by not doing so. (Note: I have not
eliminated the possibility that this was an optimization bug, but the
flatten attribute fixes it in either case.)
Combining __flatten and noinline insures that important optimizations
occur in these cases and that the inline expansion occurs in exactly one
place, thus not leading to unnecissary bloat. However, it also can
eliminate some opportunities for optimization should gcc otherwise
decide the function its self is a good candidate for inlining.
Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
---
include/linux/compiler-gcc4.h | 7 ++++++-
include/linux/compiler.h | 4 ++++
2 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
index 5755e23..38fb81d 100644
--- a/include/linux/compiler-gcc4.h
+++ b/include/linux/compiler-gcc4.h
@@ -15,7 +15,12 @@
#if GCC_VERSION >= 40102
# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
-#endif
+
+/* flatten introduced in 4.1, but broken in 4.6.0 (gcc bug #48731)*/
+# if GCC_VERSION != 40600
+# define __flatten __attribute__((flatten))
+# endif
+#endif /* GCC_VERSION >= 40102 */
#if GCC_VERSION >= 40300
/* Mark functions as cold. gcc will assume any path leading to a call
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 4d9f353..b26d606 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -244,6 +244,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
#define __always_inline inline
#endif
+#ifndef __flatten
+#define __flatten
+#endif
+
#endif /* __KERNEL__ */
/*
--
1.7.3.4
next prev parent reply other threads:[~2012-06-23 4:00 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-23 4:00 [PATCH v4 0/13] Generic Red-Black Trees Daniel Santos
2012-06-23 4:00 ` [PATCH v4 1/13] compiler-gcc4.h: Correct verion check for __compiletime_error Daniel Santos
2012-06-23 4:00 ` [PATCH v4 2/13] compiler-gcc4.h: Reorder macros based upon gcc ver Daniel Santos
2012-06-23 4:00 ` [PATCH v4 3/13] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro Daniel Santos
2012-06-23 4:00 ` [PATCH v4 4/13] compiler-gcc{3,4}.h: Use " Daniel Santos
2012-06-23 4:00 ` [PATCH v4 5/13] compiler{,-gcc4}.h: Remove duplicate macros Daniel Santos
2012-06-23 4:00 ` [PATCH v4 6/13] bug.h: Replace __linktime_error with __compiletime_error Daniel Santos
2012-06-25 18:16 ` Paul Gortmaker
2012-06-25 19:30 ` Daniel Santos
2012-06-23 4:00 ` Daniel Santos [this message]
2012-06-23 4:00 ` [PATCH v4 8/13] bug.h: Make BUILD_BUG_ON generate compile-time error Daniel Santos
2012-06-23 4:00 ` [PATCH v4 9/13] bug.h: Add BUILD_BUG_ON_NON_CONST macro Daniel Santos
2012-06-23 4:00 ` [PATCH v4 10/13] bug.h: Add gcc 4.2+ versions of BUILD_BUG_ON_* macros Daniel Santos
2012-06-23 4:00 ` [PATCH v4 11/13] rbtree.h: Generic Red-Black Trees Daniel Santos
2012-06-27 13:00 ` Peter Zijlstra
2012-06-23 4:00 ` [PATCH v4 12/13] fair.c: Use generic rbtree impl in fair scheduler Daniel Santos
2012-06-26 12:15 ` Peter Zijlstra
2012-06-26 21:59 ` Daniel Santos
2012-06-27 12:36 ` Peter Zijlstra
2012-06-23 4:00 ` [PATCH v4 13/13] documentation for rbtrees Daniel Santos
2012-06-23 23:01 ` [PATCH v4 0/13] Generic Red-Black Trees Rob Landley
2012-06-24 0:40 ` Daniel Santos
2012-06-24 4:39 ` Rob Landley
2012-06-24 7:57 ` Pavel Pisa
2012-06-24 23:29 ` Rob Landley
2012-06-25 8:35 ` Daniel Santos
2012-06-24 16:06 ` Alan Cox
2012-06-25 0:33 ` Daniel Santos
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1340424048-7759-8-git-send-email-daniel.santos@pobox.com \
--to=daniel.santos@pobox.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=david.daney@cavium.com \
--cc=dhowells@redhat.com \
--cc=hpa@zytor.com \
--cc=joe@perches.com \
--cc=khlebnikov@openvz.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sparse@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mingo@kernel.org \
--cc=paul.gortmaker@windriver.com \
--cc=pisa@cmp.felk.cvut.cz \
--cc=pjt@google.com \
--cc=richard@nod.at \
--cc=rientjes@google.com \
--cc=rob@landley.net \
--cc=rostedt@goodmis.org \
--cc=seto.hidetoshi@jp.fujitsu.com \
--cc=sparse@chrisli.org \
--cc=suresh.b.siddha@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).