From 4bfafea6922dffea145d1aa1d5f5fa4814e66173 Mon Sep 17 00:00:00 2001 From: Juzhe-Zhong Date: Fri, 15 Dec 2023 06:24:32 +0800 Subject: RISC-V: Tweak generic vector COST model Notice current generic vector cost model make PR112387 failed to vectorize. Adapt it same as ARM SVE generic vector cost model which can fix it. Committed as it is obvious fix. PR target/112387 gcc/ChangeLog: * config/riscv/riscv.cc: Adapt generic cost model same ARM SVE. gcc/testsuite/ChangeLog: * gcc.dg/vect/costmodel/riscv/rvv/pr112387.c: Moved to... * gcc.dg/vect/costmodel/riscv/rvv/pr112387-1.c: ...here. * gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c: New test. --- gcc/config/riscv/riscv.cc | 24 +++++++++++----------- .../gcc.dg/vect/costmodel/riscv/rvv/pr112387-1.c | 19 +++++++++++++++++ .../gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c | 19 +++++++++++++++++ .../gcc.dg/vect/costmodel/riscv/rvv/pr112387.c | 19 ----------------- 4 files changed, 50 insertions(+), 31 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-1.c create mode 100644 gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c delete mode 100644 gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387.c (limited to 'gcc') diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index ab0f95e..f6072671 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -355,13 +355,13 @@ static const common_vector_cost generic_vls_vector_cost = { 1, /* fp_stmt_cost */ 1, /* gather_load_cost */ 1, /* scatter_store_cost */ - 1, /* vec_to_scalar_cost */ + 2, /* vec_to_scalar_cost */ 1, /* scalar_to_vec_cost */ - 1, /* permute_cost */ - 3, /* align_load_cost */ - 3, /* align_store_cost */ - 3, /* unalign_load_cost */ - 3, /* unalign_store_cost */ + 2, /* permute_cost */ + 1, /* align_load_cost */ + 1, /* align_store_cost */ + 1, /* unalign_load_cost */ + 1, /* unalign_store_cost */ }; /* Generic costs for VLA vector operations. */ @@ -371,13 +371,13 @@ static const scalable_vector_cost generic_vla_vector_cost = { 1, /* fp_stmt_cost */ 1, /* gather_load_cost */ 1, /* scatter_store_cost */ - 1, /* vec_to_scalar_cost */ + 2, /* vec_to_scalar_cost */ 1, /* scalar_to_vec_cost */ - 1, /* permute_cost */ - 3, /* align_load_cost */ - 3, /* align_store_cost */ - 3, /* unalign_load_cost */ - 3, /* unalign_store_cost */ + 2, /* permute_cost */ + 1, /* align_load_cost */ + 1, /* align_store_cost */ + 1, /* unalign_load_cost */ + 1, /* unalign_store_cost */ }, }; diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-1.c new file mode 100644 index 0000000..ee44b5f --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-1.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -ftree-vectorize -fdump-tree-vect-details" } */ + +#include + +void +f2 (uint64_t *__restrict y, uint64_t *__restrict x, + uint64_t *__restrict indices, uint64_t n) +{ + for (int64_t i = 0; i < n; ++i) + { + y[i * 2] = x[indices[i * 2]] + 1; + y[i * 2 + 1] = x[indices[i * 2 + 1]] + 2; + } +} + +/* { dg-final { scan-tree-dump "Loop contains only SLP stmts" vect } } */ +/* { dg-final { scan-assembler-not "vlseg" } } */ +/* { dg-final { scan-assembler-not "vsseg" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c new file mode 100644 index 0000000..d9fcad6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387-2.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-march=rv64gcv -mabi=lp64d -mtune=generic-ooo -O3 -ftree-vectorize -fdump-tree-vect-details" } */ + +#include + +void +f2 (uint64_t *__restrict y, uint64_t *__restrict x, + uint64_t *__restrict indices, uint64_t n) +{ + for (int64_t i = 0; i < n; ++i) + { + y[i * 2] = x[indices[i * 2]] + 1; + y[i * 2 + 1] = x[indices[i * 2 + 1]] + 2; + } +} + +/* { dg-final { scan-tree-dump "Loop contains only SLP stmts" vect } } */ +/* { dg-final { scan-assembler-not "vlseg" } } */ +/* { dg-final { scan-assembler-not "vsseg" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387.c deleted file mode 100644 index ee44b5f..0000000 --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr112387.c +++ /dev/null @@ -1,19 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -ftree-vectorize -fdump-tree-vect-details" } */ - -#include - -void -f2 (uint64_t *__restrict y, uint64_t *__restrict x, - uint64_t *__restrict indices, uint64_t n) -{ - for (int64_t i = 0; i < n; ++i) - { - y[i * 2] = x[indices[i * 2]] + 1; - y[i * 2 + 1] = x[indices[i * 2 + 1]] + 2; - } -} - -/* { dg-final { scan-tree-dump "Loop contains only SLP stmts" vect } } */ -/* { dg-final { scan-assembler-not "vlseg" } } */ -/* { dg-final { scan-assembler-not "vsseg" } } */ -- cgit v1.1