]> gcc.gnu.org Git - gcc.git/commitdiff
RISC-V: Fix VSETVL PASS AVL/VL fetch bug[111295]
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>
Wed, 6 Sep 2023 12:47:24 +0000 (20:47 +0800)
committerJeff Law <jlaw@ventanamicro.com>
Mon, 11 Sep 2023 13:22:29 +0000 (07:22 -0600)
Fix bugzilla: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111295

gcc/ChangeLog:

PR target/111295
* config/riscv/riscv-vsetvl.cc (insert_vsetvl): Bug fix.

gcc/testsuite/ChangeLog:

PR target/111295
* gcc.target/riscv/rvv/autovec/pr111295.c: New test.

(cherry picked from commit 1b4c70d4271a00514ae20970d483c3b78d9d66ef)

gcc/config/riscv/riscv-vsetvl.cc
gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111295.c [new file with mode: 0644]

index e7e5c14617ee6126f693dd747d7dc7ab47cfb64d..dd9aeb32b5639845e33ed83abf208fc93c3d057b 100644 (file)
@@ -721,8 +721,7 @@ insert_vsetvl (enum emit_type emit_type, rtx_insn *rinsn,
       gcc_assert (has_vtype_op (rinsn) || vsetvl_insn_p (rinsn));
       /* For user vsetvli a5, zero, we should use get_vl to get the VL
         operand "a5".  */
-      rtx vl_op
-       = vsetvl_insn_p (rinsn) ? get_vl (rinsn) : info.get_avl_reg_rtx ();
+      rtx vl_op = info.get_avl_or_vl_reg ();
       gcc_assert (!vlmax_avl_p (vl_op));
       emit_vsetvl_insn (VSETVL_NORMAL, emit_type, info, vl_op, rinsn);
       return VSETVL_NORMAL;
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111295.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111295.c
new file mode 100644 (file)
index 0000000..fa20a21
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -Ofast -ftree-vectorize --param=riscv-autovec-preference=scalable -Wno-implicit-function-declaration" } */
+
+#include <stdbool.h>
+int a, b, c, e, f, g, h, i, j, k;
+long l;
+int q ()
+{
+  int r ();
+  char *o, *d;
+  _Bool p = f;
+  while (g)
+    {
+      int m, n;
+      for (; m <= n; m++)
+       *d++ = m;
+      k = 1;
+      if (e)
+       break;
+      switch (*o)
+       {
+       case 'N':
+         o++;
+         if (c)
+           if (h)
+             while (i)
+               {
+                 s (-l, ~0);
+                 t (j);
+                 d = d + (a & 10000000 ? u (r, 2) : b);
+               }
+       }
+      if (*o)
+       p ? s () : 0;
+    }
+}
This page took 0.070685 seconds and 5 git commands to generate.