https://gcc.gnu.org/g:8e28c8822d2985445de528b0f134a92239210fc4

commit 8e28c8822d2985445de528b0f134a92239210fc4
Author: Robin Dapp <rd...@ventanamicro.com>
Date:   Tue Oct 15 12:10:48 2024 +0200

    RISC-V: Use biggest_mode as mode for constants.
    
    In compute_nregs_for_mode we expect that the current variable's mode is
    at most as large as the biggest mode to be used for vectorization.
    
    This might not be true for constants as they don't actually have a mode.
    In that case, just use the biggest mode so max_number_of_live_regs
    returns 1.
    
    This fixes several test cases in the test suite.
    
    gcc/ChangeLog:
    
            PR target/116655
    
            * config/riscv/riscv-vector-costs.cc (max_number_of_live_regs):
            Use biggest mode instead of constant's saved mode.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/riscv/rvv/autovec/pr116655.c: New test.
    
    (cherry picked from commit cc217a1ecb04c9234b2cce7ba3c27701a050e402)

Diff:
---
 gcc/config/riscv/riscv-vector-costs.cc                | 14 ++++++++++----
 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116655.c | 11 +++++++++++
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/gcc/config/riscv/riscv-vector-costs.cc 
b/gcc/config/riscv/riscv-vector-costs.cc
index a80e167597be..acd86d8f69a8 100644
--- a/gcc/config/riscv/riscv-vector-costs.cc
+++ b/gcc/config/riscv/riscv-vector-costs.cc
@@ -193,7 +193,7 @@ compute_local_program_points (
       /* Collect the stmts that is vectorized and mark their program point.  */
       for (i = 0; i < nbbs; i++)
        {
-         int point = 1;
+         unsigned int point = 1;
          basic_block bb = bbs[i];
          vec<stmt_point> program_points = vNULL;
          if (dump_enabled_p ())
@@ -488,9 +488,15 @@ max_number_of_live_regs (loop_vec_info loop_vinfo, const 
basic_block bb,
       pair live_range = (*iter).second;
       for (i = live_range.first + 1; i <= live_range.second; i++)
        {
-         machine_mode mode = TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE
-                               ? BImode
-                               : TYPE_MODE (TREE_TYPE (var));
+         machine_mode mode;
+         if (TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE)
+           mode = BImode;
+         /* Constants do not have a mode, just use the biggest so
+            compute_nregs will return 1.  */
+         else if (TREE_CODE (var) == INTEGER_CST)
+           mode = biggest_mode;
+         else
+           mode = TYPE_MODE (TREE_TYPE (var));
          unsigned int nregs
            = compute_nregs_for_mode (loop_vinfo, mode, biggest_mode, lmul);
          live_vars_vec[i] += nregs;
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116655.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116655.c
new file mode 100644
index 000000000000..36768e37d005
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116655.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=rv64imv -mabi=lp64d -mrvv-max-lmul=dynamic" } */
+
+short a[5];
+int b() {
+  int c = 0;
+  for (; c <= 4; c++)
+    if (a[c])
+      break;
+  return c;
+}

Reply via email to