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

Reply via email to