From: Pan Li <[email protected]>

Add test cases for the register group overlap of the widening
reduction vwredsum.vs, to ensure the scalar operand vs1 will not
fall inside the vs2 register group.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/autovec/group_overlap/group_overlap.h:
        Add new macros for the widening reduction test cases.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m1.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m2.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m4.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m8.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m1.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m2.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m4.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m8.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m1.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m2.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m4.c: New 
test.
        * gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m8.c: New 
test.

Signed-off-by: Pan Li <[email protected]>
---
 .../rvv/autovec/group_overlap/group_overlap.h | 79 +++++++++++++++++++
 .../group_overlap/vwredsum_vs-i16-m1.c        | 20 +++++
 .../group_overlap/vwredsum_vs-i16-m2.c        | 23 ++++++
 .../group_overlap/vwredsum_vs-i16-m4.c        | 23 ++++++
 .../group_overlap/vwredsum_vs-i16-m8.c        | 23 ++++++
 .../group_overlap/vwredsum_vs-i32-m1.c        | 20 +++++
 .../group_overlap/vwredsum_vs-i32-m2.c        | 23 ++++++
 .../group_overlap/vwredsum_vs-i32-m4.c        | 23 ++++++
 .../group_overlap/vwredsum_vs-i32-m8.c        | 23 ++++++
 .../autovec/group_overlap/vwredsum_vs-i8-m1.c | 20 +++++
 .../autovec/group_overlap/vwredsum_vs-i8-m2.c | 23 ++++++
 .../autovec/group_overlap/vwredsum_vs-i8-m4.c | 23 ++++++
 .../autovec/group_overlap/vwredsum_vs-i8-m8.c | 23 ++++++
 13 files changed, 346 insertions(+)
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m1.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m2.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m4.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m8.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m1.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m2.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m4.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m8.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m1.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m2.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m4.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m8.c

diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/group_overlap.h 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/group_overlap.h
index 0eb77eb931b..8e3792adcf9 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/group_overlap.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/group_overlap.h
@@ -1240,6 +1240,54 @@
     ST_F ((void *)out, vd0, VL); OUT += VL;                                 \
     ST_F ((void *)out, vd1, VL); OUT += VL;                                 \
 
+/* A widening reduction reads vs1 with EEW = 2 * SEW while vs2 is read with
+   EEW = SEW, thus vs1 must not fall inside the vs2 register group.  Taking vs1
+   out of the vs2 register group itself is the only way the two can be asked to
+   overlap: RI_F reinterprets the narrowed vector as the widened element type
+   and GET_F extracts its IDX-th LMUL1 piece, which lives in the vs2 register
+   group.  */
+#define LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2(NT, WT, WNT, LD_NF, RI_F, GET_F,  \
+                                         IDX, OUT_F, ST_F, OUT, START, VL) \
+    NT vs0 = LD_NF ((void *)START, VL); START += VL;                        \
+    NT vs1 = LD_NF ((void *)START, VL); START += VL;                        \
+                                                                            \
+    asm volatile("nop" ::: "memory");                                       \
+                                                                            \
+    WNT vr0 = RI_F (vs0);                                                   \
+    WNT vr1 = RI_F (vs1);                                                   \
+                                                                            \
+    WT vt0 = GET_F (vr0, IDX);                                              \
+    WT vt1 = GET_F (vr1, IDX);                                              \
+                                                                            \
+    WT vd0 = OUT_F (vs0, vt0, VL);                                          \
+    WT vd1 = OUT_F (vs1, vt1, VL);                                          \
+                                                                            \
+    asm volatile("nop" ::: "memory");                                       \
+                                                                            \
+    ST_F ((void *)out, vd0, VL); OUT += VL;                                 \
+    ST_F ((void *)out, vd1, VL); OUT += VL;                                 \
+
+/* Like LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2 but vs2 is a LMUL1 register group
+   already, thus reinterpreting it as the widened element type is enough to ask
+   for vs1 and vs2 to be the very same register.  */
+#define LOOP_WIDEN_REDUCE_BODY_OVERLAP_LMUL1_X2(NT, WT, LD_NF, RI_F, OUT_F, \
+                                               ST_F, OUT, START, VL)       \
+    NT vs0 = LD_NF ((void *)START, VL); START += VL;                        \
+    NT vs1 = LD_NF ((void *)START, VL); START += VL;                        \
+                                                                            \
+    asm volatile("nop" ::: "memory");                                       \
+                                                                            \
+    WT vt0 = RI_F (vs0);                                                    \
+    WT vt1 = RI_F (vs1);                                                    \
+                                                                            \
+    WT vd0 = OUT_F (vs0, vt0, VL);                                          \
+    WT vd1 = OUT_F (vs1, vt1, VL);                                          \
+                                                                            \
+    asm volatile("nop" ::: "memory");                                       \
+                                                                            \
+    ST_F ((void *)out, vd0, VL); OUT += VL;                                 \
+    ST_F ((void *)out, vd1, VL); OUT += VL;                                 \
+
 #define DEF_GROUP_OVERLAP_UNARY_0(VL_F, NT, WT, LD_F, OUT_F, ST_F, NAME, \
                                  LOOP_BODY)                             \
   void test_group_overlap_##NAME##_##NT##_unary_0(uint8_t *data,         \
@@ -1433,4 +1481,35 @@
     }                                                                       \
   }
 
+#define DEF_GROUP_OVERLAP_REDUCE_0(VL_F, NT, WT, WNT, LD_NF, RI_F, GET_F,   \
+                                  IDX, OUT_F, ST_F, NAME, LOOP_BODY)       \
+  void test_group_overlap_##NAME##_##NT##_reduce_0(uint8_t *data,           \
+                                                  uint8_t *out,            \
+                                                  size_t limit)            \
+  {                                                                         \
+    uint8_t *start = data;                                                  \
+    uint8_t *end = data + limit;                                            \
+    size_t vl = VL_F ();                                                    \
+                                                                            \
+    while (start < end) {                                                   \
+      LOOP_BODY (NT, WT, WNT, LD_NF, RI_F, GET_F, IDX, OUT_F, ST_F, out,    \
+                start, vl);                                                \
+    }                                                                       \
+  }
+
+#define DEF_GROUP_OVERLAP_REDUCE_1(VL_F, NT, WT, LD_NF, RI_F, OUT_F, ST_F,  \
+                                  NAME, LOOP_BODY)                         \
+  void test_group_overlap_##NAME##_##NT##_reduce_1(uint8_t *data,           \
+                                                  uint8_t *out,            \
+                                                  size_t limit)            \
+  {                                                                         \
+    uint8_t *start = data;                                                  \
+    uint8_t *end = data + limit;                                            \
+    size_t vl = VL_F ();                                                    \
+                                                                            \
+    while (start < end) {                                                   \
+      LOOP_BODY (NT, WT, LD_NF, RI_F, OUT_F, ST_F, out, start, vl);         \
+    }                                                                       \
+  }
+
 #endif
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m1.c
new file mode 100644
index 00000000000..80a938b4300
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_1(
+  __riscv_vsetvlmax_e16m1,
+  vint16m1_t,
+  vint32m1_t,
+  __riscv_vle16_v_i16m1,
+  __riscv_vreinterpret_v_i16m1_i32m1,
+  __riscv_vwredsum_vs_i16m1_i32m1,
+  __riscv_vse32_v_i32m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_LMUL1_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v0,v2,v3([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v5,v1,v4([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not {vwredsum\.vs\s+v[0-9]+,v1,v1([^0-9]|$)} } 
} */
+/* { dg-final { scan-assembler-not {vwredsum\.vs\s+v[0-9]+,v2,v2([^0-9]|$)} } 
} */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m2.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m2.c
new file mode 100644
index 00000000000..874c04cce89
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m2.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e16m2,
+  vint16m2_t,
+  vint32m1_t,
+  vint32m2_t,
+  __riscv_vle16_v_i16m2,
+  __riscv_vreinterpret_v_i16m2_i32m2,
+  __riscv_vget_v_i32m2_i32m1,
+  1,
+  __riscv_vwredsum_vs_i16m2_i32m1,
+  __riscv_vse32_v_i32m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v4,v4,v1([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v2,v2,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v2,v(2|3)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v4,v(4|5)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m4.c
new file mode 100644
index 00000000000..37c1bf81970
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m4.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e16m4,
+  vint16m4_t,
+  vint32m1_t,
+  vint32m4_t,
+  __riscv_vle16_v_i16m4,
+  __riscv_vreinterpret_v_i16m4_i32m4,
+  __riscv_vget_v_i32m4_i32m1,
+  3,
+  __riscv_vwredsum_vs_i16m4_i32m1,
+  __riscv_vse32_v_i32m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v8,v8,v1([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v4,v4,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v4,v(4|5|6|7)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v8,v(8|9|10|11)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m8.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m8.c
new file mode 100644
index 00000000000..fada697634b
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i16-m8.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e16m8,
+  vint16m8_t,
+  vint32m1_t,
+  vint32m8_t,
+  __riscv_vle16_v_i16m8,
+  __riscv_vreinterpret_v_i16m8_i32m8,
+  __riscv_vget_v_i32m8_i32m1,
+  7,
+  __riscv_vwredsum_vs_i16m8_i32m1,
+  __riscv_vse32_v_i32m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v16,v16,v1([^0-9]|$)} 1 } 
} */
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v8,v8,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v8,v(8|9|10|11|12|13|14|15)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v16,v(16|17|18|19|20|21|22|23)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m1.c
new file mode 100644
index 00000000000..b23dd7f37a8
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_1(
+  __riscv_vsetvlmax_e32m1,
+  vint32m1_t,
+  vint64m1_t,
+  __riscv_vle32_v_i32m1,
+  __riscv_vreinterpret_v_i32m1_i64m1,
+  __riscv_vwredsum_vs_i32m1_i64m1,
+  __riscv_vse64_v_i64m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_LMUL1_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v0,v2,v3([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v5,v1,v4([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not {vwredsum\.vs\s+v[0-9]+,v1,v1([^0-9]|$)} } 
} */
+/* { dg-final { scan-assembler-not {vwredsum\.vs\s+v[0-9]+,v2,v2([^0-9]|$)} } 
} */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m2.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m2.c
new file mode 100644
index 00000000000..1d431d68370
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m2.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e32m2,
+  vint32m2_t,
+  vint64m1_t,
+  vint64m2_t,
+  __riscv_vle32_v_i32m2,
+  __riscv_vreinterpret_v_i32m2_i64m2,
+  __riscv_vget_v_i64m2_i64m1,
+  1,
+  __riscv_vwredsum_vs_i32m2_i64m1,
+  __riscv_vse64_v_i64m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v4,v4,v1([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v2,v2,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v2,v(2|3)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v4,v(4|5)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m4.c
new file mode 100644
index 00000000000..7a7e37e8784
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m4.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e32m4,
+  vint32m4_t,
+  vint64m1_t,
+  vint64m4_t,
+  __riscv_vle32_v_i32m4,
+  __riscv_vreinterpret_v_i32m4_i64m4,
+  __riscv_vget_v_i64m4_i64m1,
+  3,
+  __riscv_vwredsum_vs_i32m4_i64m1,
+  __riscv_vse64_v_i64m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v8,v8,v1([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v4,v4,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v4,v(4|5|6|7)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v8,v(8|9|10|11)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m8.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m8.c
new file mode 100644
index 00000000000..8c969122b9b
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i32-m8.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e32m8,
+  vint32m8_t,
+  vint64m1_t,
+  vint64m8_t,
+  __riscv_vle32_v_i32m8,
+  __riscv_vreinterpret_v_i32m8_i64m8,
+  __riscv_vget_v_i64m8_i64m1,
+  7,
+  __riscv_vwredsum_vs_i32m8_i64m1,
+  __riscv_vse64_v_i64m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v16,v16,v1([^0-9]|$)} 1 } 
} */
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v8,v8,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v8,v(8|9|10|11|12|13|14|15)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v16,v(16|17|18|19|20|21|22|23)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m1.c
new file mode 100644
index 00000000000..581f60d87da
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_1(
+  __riscv_vsetvlmax_e8m1,
+  vint8m1_t,
+  vint16m1_t,
+  __riscv_vle8_v_i8m1,
+  __riscv_vreinterpret_v_i8m1_i16m1,
+  __riscv_vwredsum_vs_i8m1_i16m1,
+  __riscv_vse16_v_i16m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_LMUL1_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v0,v2,v3([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v5,v1,v4([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not {vwredsum\.vs\s+v[0-9]+,v1,v1([^0-9]|$)} } 
} */
+/* { dg-final { scan-assembler-not {vwredsum\.vs\s+v[0-9]+,v2,v2([^0-9]|$)} } 
} */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m2.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m2.c
new file mode 100644
index 00000000000..204f6567d7b
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m2.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e8m2,
+  vint8m2_t,
+  vint16m1_t,
+  vint16m2_t,
+  __riscv_vle8_v_i8m2,
+  __riscv_vreinterpret_v_i8m2_i16m2,
+  __riscv_vget_v_i16m2_i16m1,
+  1,
+  __riscv_vwredsum_vs_i8m2_i16m1,
+  __riscv_vse16_v_i16m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v4,v4,v1([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v2,v2,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v2,v(2|3)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v4,v(4|5)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m4.c
new file mode 100644
index 00000000000..107af1359bf
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m4.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e8m4,
+  vint8m4_t,
+  vint16m1_t,
+  vint16m4_t,
+  __riscv_vle8_v_i8m4,
+  __riscv_vreinterpret_v_i8m4_i16m4,
+  __riscv_vget_v_i16m4_i16m1,
+  3,
+  __riscv_vwredsum_vs_i8m4_i16m1,
+  __riscv_vse16_v_i16m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v8,v8,v1([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v4,v4,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v4,v(4|5|6|7)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v8,v(8|9|10|11)([^0-9]|$)} } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m8.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m8.c
new file mode 100644
index 00000000000..c08e4ce1b03
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/group_overlap/vwredsum_vs-i8-m8.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d" } */
+
+#include "group_overlap.h"
+
+DEF_GROUP_OVERLAP_REDUCE_0(
+  __riscv_vsetvlmax_e8m8,
+  vint8m8_t,
+  vint16m1_t,
+  vint16m8_t,
+  __riscv_vle8_v_i8m8,
+  __riscv_vreinterpret_v_i8m8_i16m8,
+  __riscv_vget_v_i16m8_i16m1,
+  7,
+  __riscv_vwredsum_vs_i8m8_i16m1,
+  __riscv_vse16_v_i16m1,
+  vwredsum_vs,
+  LOOP_WIDEN_REDUCE_BODY_OVERLAP_X2)
+
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v16,v16,v1([^0-9]|$)} 1 } 
} */
+/* { dg-final { scan-assembler-times {vwredsum\.vs\s+v8,v8,v0([^0-9]|$)} 1 } } 
*/
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v8,v(8|9|10|11|12|13|14|15)([^0-9]|$)} } } */
+/* { dg-final { scan-assembler-not 
{vwredsum\.vs\s+v[0-9]+,v16,v(16|17|18|19|20|21|22|23)([^0-9]|$)} } } */
-- 
2.43.0

Reply via email to