From: Yury Norov <yury.norov@gmail.com>
To: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Luc Van Oostenryck <luc.vanoostenryck@gmail.com>,
linux-kernel@vger.kernel.org, linux-sparse@vger.kernel.org,
Rikard Falkeborn <rikard.falkeborn@gmail.com>
Subject: Re: [PATCH v4 1/2] compiler.h: add const_true()
Date: Mon, 30 Dec 2024 10:32:20 -0800 [thread overview]
Message-ID: <Z3LnNBWn8dHZIo7E@yury-ThinkPad> (raw)
In-Reply-To: <ZzT1wZ-WQi8zuwqG@yury-ThinkPad>
On Wed, Nov 13, 2024 at 10:53:55AM -0800, Yury Norov wrote:
> On Thu, Nov 14, 2024 at 02:18:32AM +0900, Vincent Mailhol wrote:
> > __builtin_constant_p() is known for not always being able to produce
> > constant expression [1] which led to the introduction of
> > __is_constexpr() [2]. Because of its dependency on
> > __builtin_constant_p(), statically_true() suffers from the same
> > issues.
> >
> > For example:
> >
> > void foo(int a)
> > {
> > /* fail on GCC */
> > BUILD_BUG_ON_ZERO(statically_true(a));
> >
> > /* fail on both clang and GCC */
> > static char arr[statically_true(a) ? 1 : 2];
> > }
> >
> > For the same reasons why __is_constexpr() was created to cover
> > __builtin_constant_p() edge cases, __is_constexpr() can be used to
> > resolve statically_true() limitations.
> >
> > Note that, somehow, GCC is not always able to fold this:
> >
> > __is_constexpr(x) && (x)
> >
> > It is OK in BUILD_BUG_ON_ZERO() but not in array declarations nor in
> > static_assert():
> >
> > void bar(int a)
> > {
> > /* success */
> > BUILD_BUG_ON_ZERO(__is_constexpr(a) && (a));
> >
> > /* fail on GCC */
> > static char arr[__is_constexpr(a) && (a) ? 1 : 2];
> >
> > /* fail on GCC */
> > static_assert(__is_constexpr(a) && (a));
> > }
> >
> > Encapsulating the expression in a __builtin_choose_expr() switch
> > resolves all these failed tests.
> >
> > Define a new const_true() macro which, by making use of the
> > __builtin_choose_expr() and __is_constexpr(x) combo, always produces a
> > constant expression.
> >
> > It should be noted that statically_true() is the only one able to fold
> > tautologic expressions in which at least one on the operands is not a
> > constant expression. For example:
> >
> > statically_true(true || var)
> > statically_true(var == var)
> > statically_true(var * 0 + 1)
> > statically_true(!(var * 8 % 4))
> >
> > always evaluates to true, whereas all of these would be false under
> > const_true() if var is not a constant expression [3].
> >
> > For this reason, usage of const_true() be should the exception.
> > Reflect in the documentation that const_true() is less powerful and
> > that statically_true() is the overall preferred solution.
> >
> > [1] __builtin_constant_p cannot resolve to const when optimizing
> > Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=19449
> >
> > [2] commit 3c8ba0d61d04 ("kernel.h: Retain constant expression output for max()/min()")
> > Link: https://git.kernel.org/torvalds/c/3c8ba0d61d04
> >
> > [3] https://godbolt.org/z/c61PMxqbK
> >
> > Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
>
> For the series:
>
> Reviewed-by: Yury Norov <yury.norov@gmail.com>
>
> If no objections, I'll move it with my tree.
This is already in my branch, but there was a discussion after I pulled
it. Can you guys tell me what is your conclusion on that? Should I
keep it in the branch, or drop?
Thanks,
Yury
next prev parent reply other threads:[~2024-12-30 18:32 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-13 17:18 [PATCH v4 0/2] add const_true() to simplify GENMASK_INPUT_CHECK() Vincent Mailhol
2024-11-13 17:18 ` [PATCH v4 1/2] compiler.h: add const_true() Vincent Mailhol
2024-11-13 18:53 ` Yury Norov
2024-12-30 18:32 ` Yury Norov [this message]
2024-12-31 4:58 ` Vincent Mailhol
2024-11-17 17:42 ` David Laight
2024-11-17 18:00 ` Linus Torvalds
2024-11-17 19:02 ` Linus Torvalds
2024-11-17 19:05 ` David Laight
2024-11-17 19:09 ` Linus Torvalds
2024-11-17 19:23 ` David Laight
2024-11-17 20:12 ` Linus Torvalds
2024-11-17 22:38 ` David Laight
2024-11-17 22:58 ` Linus Torvalds
2024-11-18 3:22 ` Vincent Mailhol
2024-11-18 9:27 ` David Laight
2024-11-18 17:09 ` Linus Torvalds
2024-11-13 17:18 ` [PATCH v4 2/2] linux/bits.h: simplify GENMASK_INPUT_CHECK() Vincent Mailhol
2024-11-17 17:24 ` David Laight
2024-11-17 19:45 ` David Laight
2024-11-18 1:14 ` Vincent Mailhol
2024-11-18 1:12 ` Vincent Mailhol
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=Z3LnNBWn8dHZIo7E@yury-ThinkPad \
--to=yury.norov@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sparse@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=luc.vanoostenryck@gmail.com \
--cc=mailhol.vincent@wanadoo.fr \
--cc=rikard.falkeborn@gmail.com \
--cc=torvalds@linux-foundation.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.