* [PATCH] crc32: remove useless __pure modifier from functions
@ 2009-03-02 15:18 Pekka Enberg
2009-03-02 15:50 ` Thiago Galesi
0 siblings, 1 reply; 6+ messages in thread
From: Pekka Enberg @ 2009-03-02 15:18 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel
From: Pekka Enberg <penberg@cs.helsinki.fi>
The pure attribute has absolutely no effect with GCC 4.2:
text data bss dec hex filename
2456 0 0 2456 998 lib/crc32.o.old
2456 0 0 2456 998 lib/crc32.o.new
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
---
lib/crc32.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/lib/crc32.c b/lib/crc32.c
index 49d1c9e..9ff76ad 100644
--- a/lib/crc32.c
+++ b/lib/crc32.c
@@ -49,7 +49,7 @@ MODULE_LICENSE("GPL");
* @p: pointer to buffer over which CRC is run
* @len: length of buffer @p
*/
-u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len);
+u32 crc32_le(u32 crc, unsigned char const *p, size_t len);
#if CRC_LE_BITS == 1
/*
@@ -57,7 +57,7 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len);
* simplified by inlining the table in ?: form.
*/
-u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
+u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
{
int i;
while (len--) {
@@ -69,7 +69,7 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
}
#else /* Table-based approach */
-u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
+u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
{
# if CRC_LE_BITS == 8
const u32 *b =(u32 *)p;
@@ -145,7 +145,7 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
* @p: pointer to buffer over which CRC is run
* @len: length of buffer @p
*/
-u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len);
+u32 crc32_be(u32 crc, unsigned char const *p, size_t len);
#if CRC_BE_BITS == 1
/*
@@ -153,7 +153,7 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len);
* simplified by inlining the table in ?: form.
*/
-u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
+u32 crc32_be(u32 crc, unsigned char const *p, size_t len)
{
int i;
while (len--) {
@@ -167,7 +167,7 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
}
#else /* Table-based approach */
-u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
+u32 crc32_be(u32 crc, unsigned char const *p, size_t len)
{
# if CRC_BE_BITS == 8
const u32 *b =(u32 *)p;
--
1.5.4.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] crc32: remove useless __pure modifier from functions
2009-03-02 15:18 [PATCH] crc32: remove useless __pure modifier from functions Pekka Enberg
@ 2009-03-02 15:50 ` Thiago Galesi
2009-03-02 17:28 ` Pekka Enberg
0 siblings, 1 reply; 6+ messages in thread
From: Thiago Galesi @ 2009-03-02 15:50 UTC (permalink / raw)
To: Pekka Enberg; +Cc: akpm, linux-kernel
Actually, the effects of most keywords (like const, etc) affect things
outside of the module (the callers)
http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/Function-Attributes.html
has a good explanation.
Briefly, a _pure function only depends on its parameters and the only
return is via the function return, so the compiler can optimize some
of its calls away.
--
-
Thiago Galesi
On Mon, Mar 2, 2009 at 12:18 PM, Pekka Enberg <penberg@cs.helsinki.fi> wrote:
> From: Pekka Enberg <penberg@cs.helsinki.fi>
>
> The pure attribute has absolutely no effect with GCC 4.2:
>
> text data bss dec hex filename
> 2456 0 0 2456 998 lib/crc32.o.old
> 2456 0 0 2456 998 lib/crc32.o.new
>
> Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
> ---
> lib/crc32.c | 12 ++++++------
> 1 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/lib/crc32.c b/lib/crc32.c
> index 49d1c9e..9ff76ad 100644
> --- a/lib/crc32.c
> +++ b/lib/crc32.c
> @@ -49,7 +49,7 @@ MODULE_LICENSE("GPL");
> * @p: pointer to buffer over which CRC is run
> * @len: length of buffer @p
> */
> -u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len);
> +u32 crc32_le(u32 crc, unsigned char const *p, size_t len);
>
> #if CRC_LE_BITS == 1
> /*
> @@ -57,7 +57,7 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len);
> * simplified by inlining the table in ?: form.
> */
>
> -u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
> +u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
> {
> int i;
> while (len--) {
> @@ -69,7 +69,7 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
> }
> #else /* Table-based approach */
>
> -u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
> +u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
> {
> # if CRC_LE_BITS == 8
> const u32 *b =(u32 *)p;
> @@ -145,7 +145,7 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
> * @p: pointer to buffer over which CRC is run
> * @len: length of buffer @p
> */
> -u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len);
> +u32 crc32_be(u32 crc, unsigned char const *p, size_t len);
>
> #if CRC_BE_BITS == 1
> /*
> @@ -153,7 +153,7 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len);
> * simplified by inlining the table in ?: form.
> */
>
> -u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
> +u32 crc32_be(u32 crc, unsigned char const *p, size_t len)
> {
> int i;
> while (len--) {
> @@ -167,7 +167,7 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
> }
>
> #else /* Table-based approach */
> -u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
> +u32 crc32_be(u32 crc, unsigned char const *p, size_t len)
> {
> # if CRC_BE_BITS == 8
> const u32 *b =(u32 *)p;
> --
> 1.5.4.3
>
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] crc32: remove useless __pure modifier from functions
2009-03-02 15:50 ` Thiago Galesi
@ 2009-03-02 17:28 ` Pekka Enberg
2009-03-02 17:42 ` Thiago Galesi
0 siblings, 1 reply; 6+ messages in thread
From: Pekka Enberg @ 2009-03-02 17:28 UTC (permalink / raw)
To: Thiago Galesi; +Cc: akpm, linux-kernel
On Mon, 2009-03-02 at 12:50 -0300, Thiago Galesi wrote:
> Actually, the effects of most keywords (like const, etc) affect things
> outside of the module (the callers)
>
> http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/Function-Attributes.html
> has a good explanation.
>
> Briefly, a _pure function only depends on its parameters and the only
> return is via the function return, so the compiler can optimize some
> of its calls away.
Hmm. They're not marked as pure in the header files. Does GCC look it up
from the object file or something for this...?
Pekka
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] crc32: remove useless __pure modifier from functions
2009-03-02 17:28 ` Pekka Enberg
@ 2009-03-02 17:42 ` Thiago Galesi
2009-03-03 9:33 ` Will Newton
0 siblings, 1 reply; 6+ messages in thread
From: Thiago Galesi @ 2009-03-02 17:42 UTC (permalink / raw)
To: Pekka Enberg; +Cc: akpm, linux-kernel
>
> Hmm. They're not marked as pure in the header files. Does GCC look it up
> from the object file or something for this...?
I just tested this, the answer is No :(
It only works if it's marked in the header. But when it's marked, it
works, and redundant calls are optimized.
--
-
Thiago Galesi
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] crc32: remove useless __pure modifier from functions
2009-03-02 17:42 ` Thiago Galesi
@ 2009-03-03 9:33 ` Will Newton
2009-03-03 13:17 ` Thiago Galesi
0 siblings, 1 reply; 6+ messages in thread
From: Will Newton @ 2009-03-03 9:33 UTC (permalink / raw)
To: Thiago Galesi; +Cc: Pekka Enberg, akpm, linux-kernel
On Mon, Mar 2, 2009 at 5:42 PM, Thiago Galesi <thiagogalesi@gmail.com> wrote:
>>
>> Hmm. They're not marked as pure in the header files. Does GCC look it up
>> from the object file or something for this...?
>
> I just tested this, the answer is No :(
>
> It only works if it's marked in the header. But when it's marked, it
> works, and redundant calls are optimized.
Did you see any change in size of your kernel with this annotation? It
didn't seem to have any effect as far as I could tell.
There are a number of functions in lib/ code that could be marked
__pure or __attribute_const__ but I'm not sure if it's worth the
effort, for my compiler (gcc 4.2) at least.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] crc32: remove useless __pure modifier from functions
2009-03-03 9:33 ` Will Newton
@ 2009-03-03 13:17 ` Thiago Galesi
0 siblings, 0 replies; 6+ messages in thread
From: Thiago Galesi @ 2009-03-03 13:17 UTC (permalink / raw)
To: Will Newton; +Cc: Pekka Enberg, akpm, linux-kernel
>
> Did you see any change in size of your kernel with this annotation? It
> didn't seem to have any effect as far as I could tell.
No, because I didn't test it with the kernel. Anyway, probably size
won't change a lot.
What the compiler does is: if (you're saying) it's a pure function,
and it has been called previously with the same parameters, the return
value is identical, hence, the compiler doesn't need to call the
function again.
Here's the test I did http://duskblue.org/pure_test.tar.gz Pretty
straighforward, but you have to 'make CFLAGS=-O1' to make the
optimization work.
>
> There are a number of functions in lib/ code that could be marked
> __pure or __attribute_const__ but I'm not sure if it's worth the
> effort, for my compiler (gcc 4.2) at least.
>
What const does is similar: it indicates that the function will not
change parameters marked with __const, so it will not need to reload
them after the function is called.
--
-
Thiago Galesi
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-03-03 13:17 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-03-02 15:18 [PATCH] crc32: remove useless __pure modifier from functions Pekka Enberg
2009-03-02 15:50 ` Thiago Galesi
2009-03-02 17:28 ` Pekka Enberg
2009-03-02 17:42 ` Thiago Galesi
2009-03-03 9:33 ` Will Newton
2009-03-03 13:17 ` Thiago Galesi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®