From: Bart Hartgers <bart@etpmod.phys.tue.nl>
To: Bart Hartgers <bart@etpmod.phys.tue.nl>
Cc: "Jörn Engel" <joern@wohnheim.fh-wedel.de>,
"Arjan van de Ven" <arjan@infradead.org>,
"Pekka J Enberg" <penberg@cs.Helsinki.FI>,
"Hua Zhong" <hzhong@gmail.com>,
linux-kernel@vger.kernel.org, akpm@osdl.org
Subject: Re: [PATCH] likely cleanup: remove unlikely for kfree(NULL)
Date: Wed, 26 Apr 2006 15:04:29 +0200 [thread overview]
Message-ID: <444F6FDD.7040000@etpmod.phys.tue.nl> (raw)
In-Reply-To: <444F5B74.60809@etpmod.phys.tue.nl>
[-- Attachment #1: Type: text/plain, Size: 3052 bytes --]
Bart Hartgers wrote:
> Jörn Engel wrote:
>> On Wed, 26 April 2006 13:03:34 +0200, Arjan van de Ven wrote:
>>> On Wed, 2006-04-26 at 13:57 +0300, Pekka J Enberg wrote:
>>>> On Wed, 26 April 2006 10:27:18 +0200, Arjan van de Ven wrote:
>>>>>>> what I would like is kfree to become an inline wrapper that does the
>>>>>>> null check inline, that way gcc can optimize it out (and it will in 4.1
>>>>>>> with the VRP pass) if gcc can prove it's not NULL.
>>>> On Wed, 2006-04-26 at 12:05 +0200, Jörn Engel wrote:
>>>>>> How well can gcc optimize this case?
>>>> On Wed, 26 Apr 2006, Arjan van de Ven wrote:
>>>>> if you deref'd the pointer it'll optimize it away (assuming a new enough
>>>>> gcc, like 4.1)
>>>> Here are the numbers for allyesconfig on my setup.
>>>>
>>>> Pekka
>>>>
>>>> gcc version 3.4.5 (Gentoo 3.4.5-r1, ssp-3.4.5-1.0, pie-8.7.9)
>>> this is an ancient gcc without VRP so yeah the growth is expected ;)
>> In other words, we shouldn't do this as long as most users don't have
>> gcc 4.1 or higher installed. So this is somewhat pointless at the
>> moment.
>>
>> Still, if you could respin this with gcc 4.1 and post the numbers,
>> Pekka, that would be quite interesting.
>>
>> Jörn
>>
>
> What about this:
>
> static inline void my_kfree( void *ptr )
> {
> if (__builtin_constant_p(ptr!=NULL)) {
> if (ptr!=NULL)
> my_fast_free(ptr); /* skips NULL check */
> } else {
> my_checking_free(ptr); /* does a NULL check */
> }
> }
>
> That would skip the free when ptr is known to be NULL, and skip the
> equal to NULL check if it is known to be not NULL, and do what happened
> before otherwise. In other words, it is never worse than what we have now.
>
> Attached is a small testcase in C and the resulting assembly. Note that
> my compiler doesn't catch the "not equal to zero" case, but 4.1 is
> supposed to do this.
>
> Groeten,
> Bart
>
Sorry about replying to my own mail, but I discovered that at least "gcc
(GCC) 4.1.0 (SUSE Linux)" does not seem to combine the
delete-null-pointer optimisation with the builtin_constant test. The
compiler is happy to eliminate ptr==NULL tests, but does not consider
the expression (ptr==NULL) constant! I managed to hack around this.
See the attached code, and:
bart@gum15:~> gcc -DCASE_A -m32 -O3 -S -o testje-a.S testje.c
bart@gum15:~> gcc -DCASE_B -m32 -O3 -S -o testje-b.S testje.c
bart@gum15:~> diff -u testje-a.S testje-b.S
--- testje-a.S 2006-04-26 14:57:50.000000000 +0200
+++ testje-b.S 2006-04-26 14:57:53.000000000 +0200
@@ -16,7 +16,7 @@
addl $4, %esp
popl %ebx
popl %ebp
- jmp my_fast_free
+ jmp my_slow_free
.size test, .-test
.ident "GCC: (GNU) 4.1.0 (SUSE Linux)"
.section .note.GNU-stack,"",@progbits
Anyway, CASE_A produces optimal code for gcc 4.1, and gcc 4.0 produces
identical code in both cases.
Groeten,
Bart
--
Bart Hartgers - TUE Eindhoven - http://plasimo.phys.tue.nl/bart/contact/
[-- Attachment #2: testje.c --]
[-- Type: text/x-csrc, Size: 501 bytes --]
#include <stddef.h>
extern void my_fast_free(void *);
extern void my_checking_free(void *);
static inline void my_kfree( void *ptr )
{
#ifdef CASE_A
register int is_null = 0;
if (ptr == NULL)
is_null = 1;
if (__builtin_constant_p(is_null)) {
#else /* CASE_B */
if (__builtin_constant_p(ptr==NULL)) {
#endif
if (ptr != NULL)
my_fast_free(ptr);
} else {
my_slow_free(ptr);
}
}
void test( int *bla )
{
char *hello = NULL;
my_kfree(hello);
my_kfree(bla);
*bla = 1;
my_kfree(bla);
}
[-- Attachment #3: testje-a.S --]
[-- Type: text/plain, Size: 387 bytes --]
.file "testje.c"
.text
.p2align 4,,15
.globl test
.type test, @function
test:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $4, %esp
movl 8(%ebp), %ebx
movl %ebx, (%esp)
call my_slow_free
movl $1, (%ebx)
movl %ebx, 8(%ebp)
addl $4, %esp
popl %ebx
popl %ebp
jmp my_fast_free
.size test, .-test
.ident "GCC: (GNU) 4.1.0 (SUSE Linux)"
.section .note.GNU-stack,"",@progbits
next prev parent reply other threads:[~2006-04-26 13:04 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-25 18:21 Hua Zhong
2006-04-26 7:30 ` Pekka Enberg
2006-04-26 7:53 ` Andreas Mohr
2006-04-26 7:58 ` Arjan van de Ven
2006-04-26 8:16 ` Pekka J Enberg
2006-04-26 8:27 ` Arjan van de Ven
2006-04-26 10:05 ` Adrian Bunk
2006-04-26 10:05 ` Jörn Engel
2006-04-26 10:08 ` Arjan van de Ven
2006-04-26 10:57 ` Pekka J Enberg
2006-04-26 11:03 ` Arjan van de Ven
2006-04-26 11:06 ` Jörn Engel
2006-04-26 11:37 ` Bart Hartgers
2006-04-26 13:04 ` Bart Hartgers [this message]
2006-04-26 19:07 ` Kyle Moffett
2006-04-27 6:28 ` Pekka J Enberg
2006-04-27 6:37 ` Nick Piggin
2006-04-27 8:17 ` Bart Hartgers
2006-04-27 15:23 ` Kyle Moffett
2006-04-26 14:11 ` Pekka J Enberg
2006-04-27 5:54 ` Pekka J Enberg
2006-04-27 6:17 ` Nick Piggin
2006-04-27 6:28 ` Pekka J Enberg
2006-04-27 6:50 ` Arjan van de Ven
2006-04-27 8:31 ` Adrian Bunk
2006-04-27 8:41 ` Arjan van de Ven
2006-04-27 8:56 ` Adrian Bunk
2006-04-27 9:08 ` Arjan van de Ven
2006-04-27 11:41 ` Bart Hartgers
2006-04-27 18:23 ` Adrian Bunk
2006-04-27 18:29 ` Arjan van de Ven
2006-04-26 11:05 ` Nick Piggin
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=444F6FDD.7040000@etpmod.phys.tue.nl \
--to=bart@etpmod.phys.tue.nl \
--cc=akpm@osdl.org \
--cc=arjan@infradead.org \
--cc=hzhong@gmail.com \
--cc=joern@wohnheim.fh-wedel.de \
--cc=linux-kernel@vger.kernel.org \
--cc=penberg@cs.Helsinki.FI \
/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
Powered by JetHome