OK.
Thanks.

> In general, BPF programs are JIT-ed to various architectures, and we
> cannot say for certain what memory access patterns are preferable.
> But it is clear that for the sake of the BPF verifier smaller loads are
> to be preferred when possible, so set SLOW_BYTE_ACCESS to zero.
>
> Tested on x86_64-linux-gnu host for bpf-unknown-none, no regressions.
> Also tested against Linux kernel bpf-next selftests, no changes.
>
>       PR target/123556
> gcc/
>       * config/bpf/bpf.h (SLOW_BYTE_ACCESS): Set to 0, update comment.
>
> gcc/testsuite/
>       * gcc.target/bpf/pr123556.c: New test.
> ---
>  gcc/config/bpf/bpf.h                    |  8 ++++--
>  gcc/testsuite/gcc.target/bpf/pr123556.c | 33 +++++++++++++++++++++++++
>  2 files changed, 39 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/bpf/pr123556.c
>
> diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h
> index 30bdd6e2639..c8dad55fd4c 100644
> --- a/gcc/config/bpf/bpf.h
> +++ b/gcc/config/bpf/bpf.h
> @@ -365,8 +365,12 @@ enum reg_class
>  /* The SPARC port says: Nonzero if access to memory by bytes is slow
>     and undesirable.  For RISC chips, it means that access to memory by
>     bytes is no better than access by words when possible, so grab a
> -   whole word and maybe make use of that.  */
> -#define SLOW_BYTE_ACCESS 1
> +   whole word and maybe make use of that.
> +   BPF programs will be JIT-ed to various architectures, so we cannot
> +   say for certain what the access patterns on the final architecture
> +   are.  From the BPF verifier perspective, smaller loads are actually
> +   preferable so set this to zero.  */
> +#define SLOW_BYTE_ACCESS 0
>  
>  /* Threshold of number of scalar memory-to-memory move instructions,
>     _below_ which a sequence of insns should be generated instead of a
> diff --git a/gcc/testsuite/gcc.target/bpf/pr123556.c 
> b/gcc/testsuite/gcc.target/bpf/pr123556.c
> new file mode 100644
> index 00000000000..f34e5a27ebc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/bpf/pr123556.c
> @@ -0,0 +1,33 @@
> +/* PR target/123556.
> +   Test that we do not load the bit-fields with a larger aligned load
> +   that crosses struct boundaries, which the BPF verifier rejects.  */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -S -dA -masm=normal" } */
> +
> +struct problem
> +{
> +  unsigned char f1;
> +  unsigned char f2;
> +  struct {
> +    unsigned short id;
> +    unsigned short val;
> +  } stmemb[2];
> +
> +  unsigned char ba:2;
> +  unsigned char bb:3;
> +
> +  unsigned short f3;
> +};
> +
> +int foo (struct problem *p)
> +{
> +  if (p->bb != 1)
> +    return -1;
> +  if (p->ba >= 2)
> +    return -1;
> +
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler-not "ldxw" } } */
> +/* { dg-final { scan-assembler-not "ldxdw" } } */

Reply via email to