From: Yunze Zhu <yunze...@linux.alibaba.com>

Fix a bug th.vsetvli generates from vext_x_v with an imm operand,
which reports illegal operand. This patch fix this by replacing
imm operand with reg operand in th.vsetvli.

gcc/ChangeLog:

        * config/riscv/riscv-vsetvl.cc:

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/xtheadvector/vext_x_v.c: New test.
---
 gcc/config/riscv/riscv-vsetvl.cc                |  2 +-
 .../riscv/rvv/xtheadvector/vext_x_v.c           | 17 +++++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vext_x_v.c

diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc
index 720d52964c1c..e6ee074c19fb 100644
--- a/gcc/config/riscv/riscv-vsetvl.cc
+++ b/gcc/config/riscv/riscv-vsetvl.cc
@@ -1186,7 +1186,7 @@ public:
        set the value of avl to (const_int 0) so that VSETVL PASS will
        insert vsetvl correctly.*/
     if (!get_avl ())
-      avl = GEN_INT (0);
+      avl = TARGET_XTHEADVECTOR ? gen_rtx_REG (Pmode, 0) : GEN_INT (0);
     rtx sew = gen_int_mode (get_sew (), Pmode);
     rtx vlmul = gen_int_mode (get_vlmul (), Pmode);
     rtx ta = gen_int_mode (get_ta (), Pmode);
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vext_x_v.c 
b/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vext_x_v.c
new file mode 100644
index 000000000000..be5847727cac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/xtheadvector/vext_x_v.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcxtheadvector -mabi=lp64d -O3 " } */
+#include <riscv_th_vector.h>
+
+int64_t f1 (void * in)
+{
+    vint64m1_t v = __riscv_th_vlb_v_i64m1 (in, 2);
+    vint32m1_t v2 = __riscv_th_vlb_v_i32m1 (in, 2);
+    int64_t i1 = __riscv_th_vext_x_v_i64m1_i64(v, 2);
+    int32_t i2 = __riscv_th_vext_x_v_i32m1_i32(v2, 2);
+    int64_t i = i1 + (int64_t)i2;
+    return i;
+}
+
+/* { dg-final { scan-assembler-times "th.vsetvli       zero,zero,e32,m1" 1 } } 
*/
+/* { dg-final { scan-assembler-times "th.vsetvli       zero,zero,e64,m1" 1 } } 
*/
+/* { dg-final { scan-assembler-not "th.vsetvli zero,0" } } */
-- 
2.25.1

Reply via email to