mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Vincent Mailhol <mailhol@kernel.org>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Rasmus Villemoes <linux@rasmusvillemoes.dk>,
	Sakari Ailus <sakari.ailus@linux.intel.com>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Alexander Lobakin <alobakin@pm.me>, Arnd Bergmann <arnd@arndb.de>,
	David Sterba <dsterba@suse.cz>, Ivo van Doorn <ivdoorn@gmail.com>,
	Alexey Dobriyan <adobriyan@gmail.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 0/3] container_of: refactors
Date: Wed, 15 Jul 2026 07:33:34 +0200	[thread overview]
Message-ID: <7d0d6db6-d4d9-41df-bc28-6c7c1d3f57cf@kernel.org> (raw)
In-Reply-To: <2026071514-sulfur-skydiver-7604@gregkh>

On 15/07/2026 at 06:54, Greg Kroah-Hartman wrote:
> On Tue, Jul 14, 2026 at 08:18:00PM +0200, Vincent Mailhol wrote:
>> This series refactors the container_of() function-like macro to improve
>> readability and remove a sparse/W=2 shadow warning. Further details in
>> each patch.
>>
>> While I was expecting this series to be boring and purely cosmetic, the
>> bloat-o-meter stats gave some unexpected results:
>>
>>   $ ./scripts/bloat-o-meter vmlinux7.2-rc3_before.o vmlinux7.2-rc3_after.o 
>>   add/remove: 0/0 grow/shrink: 133/93 up/down: 5914901/-14344137 (-8429236)
>>   < ... 227 lines redacted >
>>   Total: Before=2641674349, After=2633245113, chg -0.32%
>>
>> (done on v7.2-rc3 with GCC 15.3.0 on an x86_64 defconfig)
>>
>> Upon analysis, this change in size can be tracked down to places where
>> container_of() is used in combination with __builtin_constant_p().
>>
>> Here is a minimal reproducer:
>>
>> 	struct foo {
>> 		int a;
>> 	};
>>
>> 	#define to_foo(a_ptr) container_of(a_ptr, struct foo, a)
>>
>> 	int f(int *a)
>> 	{
>> 		return __builtin_constant_p(to_foo(a)->a) || a;
>> 	}
>>
>> The assembly code before this series...:
>>
>> 	xor     eax, eax
>> 	test    rdi, rdi
>> 	setne   al
>> 	ret
>>
>> ...and after:
>>
>> 	mov     eax, 1
>> 	ret
>>
>> Link: https://godbolt.org/z/fenbGexjY
>>
>> __builtin_constant_p(to_foo(a)->a) evaluates to false but gives the
>> optimiser the hint that pointer a is not NULL because of the
>> assumption that no undefined behaviour occurs. With this, the
>> expression:
>>
>> 	__builtin_constant_p(to_foo(a)->a) || a
>>
>> could be evaluated as true by the optimiser.
>>
>> But the small variation in container_of() makes it that the optimiser
>> currently misses this optimisation but manages to do it after the
>> simplification of patch #3 of this series.
>>
>> When __builtin_constant_p()'s argument is not trivially a compile time
>> constant, the result of __builtin_constant_p() comes late in the
>> evaluation process. And if it comes too late, after some other
>> optimisations were already done, the compiler will not retry and simply
>> miss these optimisations.
>>
>> Note that the above example is very fragile and the results shown in
>> the godbolt link might not be reproducible under very small
>> variations.
>>
>> Signed-off-by: Vincent Mailhol <mailhol@kernel.org>
> 
> "fun" thing is, clang gets this right without your change, so this only
> seems to help the gcc users.

Indeed. I forgot to mention it, but I also observed that clang is not
impacted by these weird __builtin_constant_p() intricacies.

One lesson learned it that in GCC __builtin_constant_p() can become an
optimisation killer.

> Anyway, very nice optimizations, thanks for this!  I'll queue these up
> later today.
Thanks!


Yours sincerely,
Vincent Mailhol


      reply	other threads:[~2026-07-15  5:33 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-14 18:18 Vincent Mailhol
2026-07-14 18:18 ` [PATCH 1/3] container_of: apply typeof_member() to container_of() Vincent Mailhol
2026-07-14 18:18 ` [PATCH 2/3] container_of: remove useless pair of parentheses Vincent Mailhol
2026-07-15 14:30   ` Alexey Dobriyan
2026-07-15 14:51     ` Vincent Mailhol
2026-07-15 14:57       ` Greg Kroah-Hartman
2026-07-15 16:27         ` Vincent Mailhol
2026-07-16 14:09           ` Greg Kroah-Hartman
2026-07-14 18:18 ` [PATCH 3/3] container_of: remove local __mptr variable Vincent Mailhol
2026-07-15  4:54 ` [PATCH 0/3] container_of: refactors Greg Kroah-Hartman
2026-07-15  5:33   ` Vincent Mailhol [this message]

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=7d0d6db6-d4d9-41df-bc28-6c7c1d3f57cf@kernel.org \
    --to=mailhol@kernel.org \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=alobakin@pm.me \
    --cc=arnd@arndb.de \
    --cc=dsterba@suse.cz \
    --cc=gregkh@linuxfoundation.org \
    --cc=ivdoorn@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@rasmusvillemoes.dk \
    --cc=ndesaulniers@google.com \
    --cc=sakari.ailus@linux.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