RISC-V: Fix AVL/VL bug of VSETVL PASS[PR111548]

Message ID 20230924031701.398742-1-juzhe.zhong@rivai.ai
State Unresolved
Headers
Series RISC-V: Fix AVL/VL bug of VSETVL PASS[PR111548] |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

juzhe.zhong@rivai.ai Sept. 24, 2023, 3:17 a.m. UTC
  This patch fixes that AVL/VL reg incorrect fetch in VSETVL PASS.

C/C++ regression passed.

But gfortran didn't run yet. I am still finding a way to run it.

Will commit it when I pass the fortran regression.

	PR target/111548

gcc/ChangeLog:

	* config/riscv/riscv-vsetvl.cc (earliest_pred_can_be_fused_p):

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr111548.c: New test.

---
 gcc/config/riscv/riscv-vsetvl.cc              | 16 +++++-------
 .../gcc.target/riscv/rvv/autovec/pr111548.c   | 25 +++++++++++++++++++
 2 files changed, 31 insertions(+), 10 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111548.c
  

Patch

diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc
index e0f61148ef3..7af33e7ea6f 100644
--- a/gcc/config/riscv/riscv-vsetvl.cc
+++ b/gcc/config/riscv/riscv-vsetvl.cc
@@ -1514,7 +1514,6 @@  earliest_pred_can_be_fused_p (const bb_info *earliest_pred,
 			      const vector_insn_info &earliest_info,
 			      const vector_insn_info &expr, rtx *vlmax_vl)
 {
-  rtx vl = NULL_RTX;
   /* Backward VLMAX VL:
        bb 3:
 	 vsetivli zero, 1 ... -> vsetvli t1, zero
@@ -1526,10 +1525,9 @@  earliest_pred_can_be_fused_p (const bb_info *earliest_pred,
        We should forward "t1".  */
   if (!earliest_info.has_avl_reg () && expr.has_avl_reg ())
     {
-      rtx avl = expr.get_avl ();
+      rtx avl_or_vl_reg = expr.get_avl_or_vl_reg ();
+      gcc_assert (avl_or_vl_reg);
       const insn_info *last_insn = earliest_info.get_insn ();
-      if (vlmax_avl_p (avl))
-	vl = get_vl (expr.get_insn ()->rtl ());
       /* To fuse demand on earlest edge, we make sure AVL/VL
 	 didn't change from the consume insn to the predecessor
 	 of the edge.  */
@@ -1538,17 +1536,15 @@  earliest_pred_can_be_fused_p (const bb_info *earliest_pred,
 	   && after_or_same_p (i, last_insn);
 	   i = i->prev_nondebug_insn ())
 	{
-	  if (!vl && find_access (i->defs (), REGNO (avl)))
+	  if (find_access (i->defs (), REGNO (avl_or_vl_reg)))
 	    return false;
-	  if (vl && find_access (i->defs (), REGNO (vl)))
-	    return false;
-	  if (vl && find_access (i->uses (), REGNO (vl)))
+	  if (find_access (i->uses (), REGNO (avl_or_vl_reg)))
 	    return false;
 	}
+      if (vlmax_vl && vlmax_avl_p (expr.get_avl ()))
+	*vlmax_vl = avl_or_vl_reg;
     }
 
-  if (vlmax_vl)
-    *vlmax_vl = vl;
   return true;
 }
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111548.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111548.c
new file mode 100644
index 00000000000..9bdf42dbed8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr111548.c
@@ -0,0 +1,25 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -Ofast -Wno-implicit-int -Wno-implicit-function-declaration -Wno-int-conversion" } */
+
+a, c, d; /* { dg-warning "data definition has no type or storage class" } */
+*b; /* { dg-warning "data definition has no type or storage class" } */
+h() {
+  int e;
+  i();
+  for (;;) {
+    unsigned f;
+    char *g;
+    f = a;
+    for (; f; f--) {
+      if (*g == '"')
+        e = !e;
+      *b = g++;
+    }
+    if (c)
+      break;
+    f = d;
+    for (; d;)
+      if (e)
+        b++;
+  }
+}