diff mbox series

RISC-V: Use biggest_mode as mode for constants.

Message ID D4WE90FCQYV0.VKFJCA1WGSOZ@gmail.com
State New
Headers show
Series RISC-V: Use biggest_mode as mode for constants. | expand

Commit Message

Robin Dapp Oct. 15, 2024, 12:55 p.m. UTC
Hi,

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.

Regtested on rv64gcv and letting the CI work out the rest.

Regards
 Robin

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.
---
 gcc/config/riscv/riscv-vector-costs.cc             | 14 ++++++++++----
 .../gcc.target/riscv/rvv/autovec/pr116655.c        | 11 +++++++++++
 2 files changed, 21 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116655.c

Comments

Jeff Law Oct. 15, 2024, 1:58 p.m. UTC | #1
On 10/15/24 6:55 AM, Robin Dapp wrote:
> Hi,
> 
> 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.
> 
> Regtested on rv64gcv and letting the CI work out the rest.
> 
> Regards
>   Robin
> 
> 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.
Seems reasonable.

jeff
钟居哲 Oct. 15, 2024, 10:57 p.m. UTC | #2
LGTM



juzhe.zhong@rivai.ai
 
From: Robin Dapp
Date: 2024-10-15 20:55
To: gcc-patches
CC: palmer@dabbelt.com; kito.cheng@gmail.com; juzhe.zhong@rivai.ai; jeffreyalaw@gmail.com; pan2.li@intel.com; rdapp.gcc@gmail.com
Subject: [PATCH] RISC-V: Use biggest_mode as mode for constants.
Hi,
 
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.
 
Regtested on rv64gcv and letting the CI work out the rest.
 
Regards
Robin
 
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.
---
gcc/config/riscv/riscv-vector-costs.cc             | 14 ++++++++++----
.../gcc.target/riscv/rvv/autovec/pr116655.c        | 11 +++++++++++
2 files changed, 21 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr116655.c
 
diff --git a/gcc/config/riscv/riscv-vector-costs.cc b/gcc/config/riscv/riscv-vector-costs.cc
index 25570bd4004..67b9e3e8f41 100644
--- a/gcc/config/riscv/riscv-vector-costs.cc
+++ b/gcc/config/riscv/riscv-vector-costs.cc
@@ -194,7 +194,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 ())
@@ -489,9 +489,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 00000000000..36768e37d00
--- /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;
+}
diff mbox series

Patch

diff --git a/gcc/config/riscv/riscv-vector-costs.cc b/gcc/config/riscv/riscv-vector-costs.cc
index 25570bd4004..67b9e3e8f41 100644
--- a/gcc/config/riscv/riscv-vector-costs.cc
+++ b/gcc/config/riscv/riscv-vector-costs.cc
@@ -194,7 +194,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 ())
@@ -489,9 +489,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 00000000000..36768e37d00
--- /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;
+}