[PATCH v2] RISC-V: Allow vector constants in riscv_const_insns.
Kito Cheng
kito.cheng@sifive.com
Thu May 11 14:15:10 GMT 2023
LGTM, thanks :)
On Thu, May 11, 2023 at 8:47 PM Robin Dapp <rdapp.gcc@gmail.com> wrote:
>
> > OK, you can go ahead commit patch. I am gonna send another patch to
> > fix this.
> I agree that we should handle more constants but I'd still rather go
> ahead now and fix things later. The patch is more about the test
> rather than the actual change anyway.
>
> Jeff already ack'ed v1, maybe waiting for Kito's OK to push still.
>
> (Minor) changes from v1:
> - Rebase vs Juzhe's patch
> - Change test format to match binops.
>
>
> This patch adds various vector constants to riscv_const_insns in order
> for them to be properly recognized as immediate operands. This then
> allows to emit vmv.v.i instructions via autovectorization.
>
> gcc/ChangeLog:
>
> * config/riscv/riscv.cc (riscv_const_insns): Add permissible
> vector constants.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/riscv/rvv/autovec/vmv-imm-rv32.c: New test.
> * gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c: New test.
> * gcc.target/riscv/rvv/autovec/vmv-imm-template.h: New test.
> * gcc.target/riscv/rvv/autovec/vmv-imm-run.c: New test.
> ---
> gcc/config/riscv/riscv.cc | 7 +++
> .../riscv/rvv/autovec/vmv-imm-run.c | 57 +++++++++++++++++++
> .../riscv/rvv/autovec/vmv-imm-rv32.c | 6 ++
> .../riscv/rvv/autovec/vmv-imm-rv64.c | 6 ++
> .../riscv/rvv/autovec/vmv-imm-template.h | 54 ++++++++++++++++++
> 5 files changed, 130 insertions(+)
> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-run.c
> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv32.c
> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c
> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h
>
> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index 8f032250b0f..de578b5b899 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -1291,6 +1291,13 @@ riscv_const_insns (rtx x)
> return 1;
> }
> }
> + /* Constants from -16 to 15 can be loaded with vmv.v.i.
> + The Wc0, Wc1 constraints are already covered by the
> + vi constraint so we do not need to check them here
> + separately. */
> + else if (TARGET_VECTOR && satisfies_constraint_vi (x))
> + return 1;
> +
> /* TODO: We may support more const vector in the future. */
> return x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
> }
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-run.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-run.c
> new file mode 100644
> index 00000000000..309a296b686
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-run.c
> @@ -0,0 +1,57 @@
> +/* { dg-do run { target { riscv_vector } } } */
> +/* { dg-additional-options "-std=c99 -fno-vect-cost-model --param=riscv-autovec-preference=scalable -fno-builtin" } */
> +
> +#include "vmv-imm-template.h"
> +
> +#include <stdint.h>
> +#include <assert.h>
> +
> +#define SZ 512
> +
> +#define TEST_POS(TYPE,VAL) \
> + TYPE a##TYPE##VAL[SZ]; \
> + vmv_##VAL (a##TYPE##VAL, SZ); \
> + for (int i = 0; i < SZ; i++) \
> + assert (a##TYPE##VAL[i] == VAL);
> +
> +#define TEST_NEG(TYPE,VAL) \
> + TYPE am##TYPE##VAL[SZ]; \
> + vmv_m##VAL (am##TYPE##VAL, SZ); \
> + for (int i = 0; i < SZ; i++) \
> + assert (am##TYPE##VAL[i] == -VAL);
> +
> +int main ()
> +{
> + TEST_NEG(int8_t, 16)
> + TEST_NEG(int8_t, 15)
> + TEST_NEG(int8_t, 14)
> + TEST_NEG(int8_t, 13)
> + TEST_NEG(int16_t, 12)
> + TEST_NEG(int16_t, 11)
> + TEST_NEG(int16_t, 10)
> + TEST_NEG(int16_t, 9)
> + TEST_NEG(int32_t, 8)
> + TEST_NEG(int32_t, 7)
> + TEST_NEG(int32_t, 6)
> + TEST_NEG(int32_t, 5)
> + TEST_NEG(int64_t, 4)
> + TEST_NEG(int64_t, 3)
> + TEST_NEG(int64_t, 2)
> + TEST_NEG(int64_t, 1)
> + TEST_POS(uint8_t, 0)
> + TEST_POS(uint8_t, 1)
> + TEST_POS(uint8_t, 2)
> + TEST_POS(uint8_t, 3)
> + TEST_POS(uint16_t, 4)
> + TEST_POS(uint16_t, 5)
> + TEST_POS(uint16_t, 6)
> + TEST_POS(uint16_t, 7)
> + TEST_POS(uint32_t, 8)
> + TEST_POS(uint32_t, 9)
> + TEST_POS(uint32_t, 10)
> + TEST_POS(uint32_t, 11)
> + TEST_POS(uint64_t, 12)
> + TEST_POS(uint64_t, 13)
> + TEST_POS(uint64_t, 14)
> + TEST_POS(uint64_t, 15)
> +}
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv32.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv32.c
> new file mode 100644
> index 00000000000..c419256cd45
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv32.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-std=c99 -march=rv32gcv -mabi=ilp32d -fno-vect-cost-model --param=riscv-autovec-preference=scalable -fno-builtin" } */
> +
> +#include "vmv-imm-template.h"
> +
> +/* { dg-final { scan-assembler-times "vmv.v.i" 32 } } */
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c
> new file mode 100644
> index 00000000000..520321e1c73
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c
> @@ -0,0 +1,6 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-std=c99 -march=rv64gcv -fno-vect-cost-model --param=riscv-autovec-preference=scalable -fno-builtin" } */
> +
> +#include "vmv-imm-template.h"
> +
> +/* { dg-final { scan-assembler-times "vmv.v.i" 32 } } */
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h
> new file mode 100644
> index 00000000000..93ba5204c2e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h
> @@ -0,0 +1,54 @@
> +#include <stdint.h>
> +#include <assert.h>
> +
> +#define VMV_POS(TYPE,VAL) \
> + __attribute__ ((noipa)) \
> + void vmv_##VAL (TYPE dst[], int n) \
> + { \
> + for (int i = 0; i < n; i++) \
> + dst[i] = VAL; \
> + }
> +
> +#define VMV_NEG(TYPE,VAL) \
> + __attribute__ ((noipa)) \
> + void vmv_m##VAL (TYPE dst[], int n) \
> + { \
> + for (int i = 0; i < n; i++) \
> + dst[i] = -VAL; \
> + }
> +
> +#define TEST_ALL() \
> +VMV_NEG(int8_t,16) \
> +VMV_NEG(int8_t,15) \
> +VMV_NEG(int8_t,14) \
> +VMV_NEG(int8_t,13) \
> +VMV_NEG(int16_t,12) \
> +VMV_NEG(int16_t,11) \
> +VMV_NEG(int16_t,10) \
> +VMV_NEG(int16_t,9) \
> +VMV_NEG(int32_t,8) \
> +VMV_NEG(int32_t,7) \
> +VMV_NEG(int32_t,6) \
> +VMV_NEG(int32_t,5) \
> +VMV_NEG(int64_t,4) \
> +VMV_NEG(int64_t,3) \
> +VMV_NEG(int64_t,2) \
> +VMV_NEG(int64_t,1) \
> +VMV_POS(uint8_t,0) \
> +VMV_POS(uint8_t,1) \
> +VMV_POS(uint8_t,2) \
> +VMV_POS(uint8_t,3) \
> +VMV_POS(uint16_t,4) \
> +VMV_POS(uint16_t,5) \
> +VMV_POS(uint16_t,6) \
> +VMV_POS(uint16_t,7) \
> +VMV_POS(uint32_t,8) \
> +VMV_POS(uint32_t,9) \
> +VMV_POS(uint32_t,10) \
> +VMV_POS(uint32_t,11) \
> +VMV_POS(uint64_t,12) \
> +VMV_POS(uint64_t,13) \
> +VMV_POS(uint64_t,14) \
> +VMV_POS(uint64_t,15)
> +
> +TEST_ALL()
> --
> 2.40.0
More information about the Gcc-patches
mailing list