Hi,
This patch disables memsets with a size less than a vector for
xtheadvector. As xtheadvector does not support fractional
LMUL we need to ensure to not emit those vectors that might
use it.
Regtested on rv64gcv_zvl512b.
Regards
Robin
PR target/123910
gcc/ChangeLog:
* config/riscv/riscv-string.cc (riscv_expand_block_move):
Remove !xtheadvector guard.
(use_vector_stringop_p): Guard small LMULs.
(check_vectorise_memory_operation): Ditto.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/pr123910.c: New test.
---
gcc/config/riscv/riscv-string.cc | 14 ++++++++++++--
.../gcc.target/riscv/rvv/autovec/pr123910.c | 11 +++++++++++
2 files changed, 23 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123910.c
diff --git a/gcc/config/riscv/riscv-string.cc b/gcc/config/riscv/riscv-string.cc
index ad71a103edc..51b98e4906c 100644
--- a/gcc/config/riscv/riscv-string.cc
+++ b/gcc/config/riscv/riscv-string.cc
@@ -980,7 +980,7 @@ riscv_expand_block_move_scalar (rtx dest, rtx src, rtx
length)
bool
riscv_expand_block_move (rtx dest, rtx src, rtx length)
{
- if ((TARGET_VECTOR && !TARGET_XTHEADVECTOR)
+ if (TARGET_VECTOR
&& stringop_strategy & STRATEGY_VECTOR)
{
bool ok = riscv_vector::expand_block_move (dest, src, length, false);
@@ -1086,9 +1086,15 @@ use_vector_stringop_p (struct stringop_info &info,
HOST_WIDE_INT max_ew,
rtx avl = length_in;
HOST_WIDE_INT potential_ew = max_ew;
- if (!TARGET_VECTOR || !(stringop_strategy & STRATEGY_VECTOR))
+ if (!TARGET_VECTOR
+ || !(stringop_strategy & STRATEGY_VECTOR))
return false;
+ if (TARGET_XTHEADVECTOR
+ && (!CONST_INT_P (length_in)
+ || known_lt (INTVAL (length_in), BYTES_PER_RISCV_VECTOR)))
+ return false;
+
int max_lmul = TARGET_MAX_LMUL;
if (rvv_max_lmul == RVV_CONV_DYNAMIC)
max_lmul = RVV_M1;
@@ -1598,6 +1604,10 @@ check_vectorise_memory_operation (rtx length_in,
HOST_WIDE_INT &lmul_out)
HOST_WIDE_INT length = INTVAL (length_in);
+ if (TARGET_XTHEADVECTOR
+ && known_lt (length, BYTES_PER_RISCV_VECTOR))
+ return false;
+
/* If it's tiny, default operation is likely better; maybe worth
considering fractional lmul in the future as well. */
if (length < (TARGET_MIN_VLEN / 8))
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123910.c
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123910.c
new file mode 100644
index 00000000000..a38dbb5fa5c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123910.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=xt-c920 -mrvv-vector-bits=zvl" } */
+
+int i;
+void *p;
+
+void
+foo ()
+{
+ __builtin_memset (p, i, 8);
+}
--
2.52.0