diff options
-rw-r--r-- | gcc/config/riscv/riscv.cc | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/rvv/autovec/align-1.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/rvv/autovec/align-2.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-rv32gcv.c | 10 |
4 files changed, 44 insertions, 4 deletions
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index de578b5..a770fdf 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -7499,6 +7499,16 @@ riscv_preferred_simd_mode (scalar_mode mode) return word_mode; } +/* Implement target hook TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT. */ + +static poly_uint64 +riscv_vectorize_preferred_vector_alignment (const_tree type) +{ + if (riscv_v_ext_vector_mode_p (TYPE_MODE (type))) + return TYPE_ALIGN (TREE_TYPE (type)); + return TYPE_ALIGN (type); +} + /* Initialize the GCC target structure. */ #undef TARGET_ASM_ALIGNED_HI_OP #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" @@ -7771,6 +7781,10 @@ riscv_preferred_simd_mode (scalar_mode mode) #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE riscv_preferred_simd_mode +#undef TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT +#define TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT \ + riscv_vectorize_preferred_vector_alignment + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-riscv.h" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/align-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/align-1.c new file mode 100644 index 0000000..14201e1 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/align-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv32gcv -mabi=ilp32d -O3 --param riscv-autovec-preference=scalable" } */ + +void __attribute__((noinline, noclone)) +f (int * __restrict dst, int * __restrict op1, int * __restrict op2, int count) +{ + for (int i = 0; i < count; ++i) + dst[i] = op1[i] + op2[i]; +} + +/* { dg-final { scan-assembler-not "lw" } } */ +/* { dg-final { scan-assembler-not "sw" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/align-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/align-2.c new file mode 100644 index 0000000..812584e --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/align-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv32gcv -mabi=ilp32d -O3 --param riscv-autovec-preference=fixed-vlmax" } */ + +void __attribute__((noinline, noclone)) +f (int * __restrict dst, int * __restrict op1, int * __restrict op2, int count) +{ + for (int i = 0; i < count; ++i) + dst[i] = op1[i] + op2[i]; +} + +/* { dg-final { scan-assembler-not "lw" } } */ +/* { dg-final { scan-assembler-not "sw" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-rv32gcv.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-rv32gcv.c index da0f79a..d98100b 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-rv32gcv.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-rv32gcv.c @@ -4,8 +4,10 @@ #include "shift-template.h" /* TODO: For int16_t and uint16_t we need widening/promotion patterns. - Therefore, expect only 4 vsll.vv instead of 6 for now. */ + We don't check the assembler number since lacking patterns make + auto-vectorization inconsistent in LMUL = 1/2/4/8. */ + +/* { dg-final { scan-assembler {\tvsll\.vv} } } */ +/* { dg-final { scan-assembler {\tvsrl\.vv} } } */ +/* { dg-final { scan-assembler {\tvsra\.vv} } } */ -/* { dg-final { scan-assembler-times {\tvsll\.vv} 4 } } */ -/* { dg-final { scan-assembler-times {\tvsrl\.vv} 3 } } */ -/* { dg-final { scan-assembler-times {\tvsra\.vv} 3 } } */ |