mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [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®