2009-03-02 15:18:36

by Pekka Enberg

[permalink] [raw]
Subject: [PATCH] crc32: remove useless __pure modifier from functions

From: Pekka Enberg <[email protected]>

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 <[email protected]>
---
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



2009-03-02 15:51:17

by Thiago Galesi

[permalink] [raw]
Subject: Re: [PATCH] crc32: remove useless __pure modifier from functions

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 <[email protected]> wrote:
> From: Pekka Enberg <[email protected]>
>
> 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 <[email protected]>
> ---
> ?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 [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at ?http://www.tux.org/lkml/
>

2009-03-02 17:28:44

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH] crc32: remove useless __pure modifier from functions

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

2009-03-02 17:42:49

by Thiago Galesi

[permalink] [raw]
Subject: Re: [PATCH] crc32: remove useless __pure modifier from functions

>
> 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

2009-03-03 09:33:27

by Will Newton

[permalink] [raw]
Subject: Re: [PATCH] crc32: remove useless __pure modifier from functions

On Mon, Mar 2, 2009 at 5:42 PM, Thiago Galesi <[email protected]> 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.

2009-03-03 13:17:41

by Thiago Galesi

[permalink] [raw]
Subject: Re: [PATCH] crc32: remove useless __pure modifier from functions

>
> 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