All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
To: Stanislav Fomichev <sdf@fomichev.me>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>,
	Eric Dumazet <edumazet@google.com>,
	netdev <netdev@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Subject: Re: [PATCH] tcp: don't use __constant_cpu_to_be32
Date: Sat, 16 Mar 2019 16:18:41 +0900	[thread overview]
Message-ID: <20190316071841.GA30386@tigerII.localdomain> (raw)
In-Reply-To: <20190316051902.GA27630@tigerII.localdomain>

On (03/16/19 14:19), Sergey Senozhatsky wrote:
> > See my recent commit a0517a0f7ef23 ("selftests/bpf: use
> > __bpf_constant_htons in test_prog.c") where compiler was not smart
> > enough to figure it out (you can google similar issues for GCC < 4.8).
> 
> Allow me to disagree.
> 
> The error in a0517a0f7ef23 says
> 
> 	error: implicit declaration of function '__builtin_bswap16'
> 
> which doesn't sound like "the compiler was not smart".
> 
> Let's look at __swab16
> 
> 100 #ifdef __HAVE_BUILTIN_BSWAP16__
> 101 #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x))
> 102 #else
> 103 #define __swab16(x)                             \
> 104         (__builtin_constant_p((__u16)(x)) ?     \
> 105         ___constant_swab16(x) :                 \
> 106         __fswab16(x))
> 107 #endif
> 
> We can call __builtin_bswap16() only when the compiler has that builtin,
> which is what #ifdef __HAVE_BUILTIN_BSWAP16__ for.
> 
> But this is not what tools/testing/selftests/bpf/bpf_endian.h does
> 
> # define __bpf_ntohs(x)                 __builtin_bswap16(x)
> # define __bpf_htons(x)                 __builtin_bswap16(x)
> 
> So I sort of suspect that what should have been done was that
> __HAVE_BUILTIN_BSWAP16__ ifdef, just like what include/uapi/linux/swab.h
> does.

E.g.

#define ____const(x)	printf("const %d\n", (x))
#define ____noconst(x)	printf("noconst %d\n", (x))
#define const_test(x)	(__builtin_constant_p(x) ? ____const((x)) : ____noconst((x)))

The compiler should optimize out !__builtin_constant_p (dead code elimination
phase - dce), if it can compile the code in the first place.

So if we replace ____noconst with

#define ____noconst(x)	printf2("noconst %d\n", (x))

then compiler wouldn't be able to compile the code and thus wouldn't
be able to perform dce.

__builtin_constant_p, unlike `#if 0', is not handled by the preprocessor.

Verified with gcc 8.3, gcc 4.9, gcc 4.7 at compiler explorer website
https://gcc.godbolt.org/ - GCC is smart enough to figure out
__builtin_constant_p and do dce, given that it compile the code.

	-ss

  reply	other threads:[~2019-03-16  7:18 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-14  6:15 [PATCH] tcp: don't use __constant_cpu_to_be32 Sergey Senozhatsky
2019-03-14 12:42 ` Eric Dumazet
2019-03-15  1:20   ` Sergey Senozhatsky
2019-03-15 17:24     ` Stanislav Fomichev
2019-03-16  5:19       ` Sergey Senozhatsky
2019-03-16  7:18         ` Sergey Senozhatsky [this message]
2019-03-16 14:26         ` Sergey Senozhatsky
2019-03-18 16:32           ` Stanislav Fomichev
2019-03-19  1:29             ` Sergey Senozhatsky
2019-03-18 16:28         ` Stanislav Fomichev

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=20190316071841.GA30386@tigerII.localdomain \
    --to=sergey.senozhatsky@gmail.com \
    --cc=edumazet@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=sdf@fomichev.me \
    --cc=sergey.senozhatsky.work@gmail.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 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.