Re: [PATCH] RISC-V: Fix ICE in LRA for LMUL < 1 vector spillings

2023-03-22 Thread Kito Cheng via Gcc-patches
Committed as 
https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=cd0c433e5faba9a18f64881cd761a53a530aa798
with comment tweak.

On Wed, Mar 22, 2023 at 10:50 AM  wrote:
>
> From: Ju-Zhe Zhong 
>
> gcc/ChangeLog:
>
> * config/riscv/riscv-protos.h (emit_vlmax_vsetvl): Define as global.
> (emit_vlmax_op): Ditto.
> * config/riscv/riscv-v.cc (get_sew): New function.
> (emit_vlmax_vsetvl): Adapt function.
> (emit_pred_op): Ditto.
> (emit_vlmax_op): Ditto.
> (emit_nonvlmax_op): Ditto.
> (legitimize_move): Fix LRA ICE.
> (gen_no_side_effects_vsetvl_rtx): Adapt function.
> * config/riscv/vector.md (@mov_lra): New 
> pattern.
> (@mov_lra): Ditto.
> (*mov_lra): Ditto.
> (*mov_lra): Ditto.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/riscv/rvv/base/binop_vv_constraint-4.c: Adapt testcase.
> * gcc.target/riscv/rvv/base/binop_vv_constraint-6.c: Ditto.
> * gcc.target/riscv/rvv/base/binop_vx_constraint-127.c: Ditto.
> * gcc.target/riscv/rvv/base/spill-1.c: Ditto.
> * gcc.target/riscv/rvv/base/spill-2.c: Ditto.
> * gcc.target/riscv/rvv/base/spill-3.c: Ditto.
> * gcc.target/riscv/rvv/base/spill-5.c: Ditto.
> * gcc.target/riscv/rvv/base/spill-7.c: Ditto.
> * g++.target/riscv/rvv/base/bug-18.C: New test.
> * gcc.target/riscv/rvv/base/merge_constraint-3.c: New test.
> * gcc.target/riscv/rvv/base/merge_constraint-4.c: New test.
>
> ---
>  gcc/config/riscv/riscv-protos.h   |   2 +
>  gcc/config/riscv/riscv-v.cc   |  67 +--
>  gcc/config/riscv/vector.md|  56 ++
>  .../g++.target/riscv/rvv/base/bug-18.C| 140 +++
>  .../riscv/rvv/base/binop_vv_constraint-4.c|   1 +
>  .../riscv/rvv/base/binop_vv_constraint-6.c|   1 +
>  .../riscv/rvv/base/binop_vx_constraint-127.c  |   2 +-
>  .../riscv/rvv/base/merge_constraint-3.c   |  95 ++
>  .../riscv/rvv/base/merge_constraint-4.c   |  28 +++
>  .../gcc.target/riscv/rvv/base/spill-1.c   | 168 +-
>  .../gcc.target/riscv/rvv/base/spill-2.c   | 112 ++--
>  .../gcc.target/riscv/rvv/base/spill-3.c   |  56 +++---
>  .../gcc.target/riscv/rvv/base/spill-5.c   |  26 +--
>  .../gcc.target/riscv/rvv/base/spill-7.c   | 161 +
>  14 files changed, 636 insertions(+), 279 deletions(-)
>  create mode 100644 gcc/testsuite/g++.target/riscv/rvv/base/bug-18.C
>  create mode 100644 
> gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-3.c
>  create mode 100644 
> gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-4.c
>
> diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h
> index f35aaf35b48..060dddbdc22 100644
> --- a/gcc/config/riscv/riscv-protos.h
> +++ b/gcc/config/riscv/riscv-protos.h
> @@ -157,7 +157,9 @@ bool check_builtin_call (location_t, vec, 
> unsigned int,
>tree, unsigned int, tree *);
>  bool const_vec_all_same_in_range_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
>  bool legitimize_move (rtx, rtx, machine_mode);
> +void emit_vlmax_vsetvl (machine_mode, rtx);
>  void emit_vlmax_op (unsigned, rtx, rtx, machine_mode);
> +void emit_vlmax_op (unsigned, rtx, rtx, rtx, machine_mode);
>  void emit_nonvlmax_op (unsigned, rtx, rtx, rtx, machine_mode);
>  enum vlmul_type get_vlmul (machine_mode);
>  unsigned int get_ratio (machine_mode);
> diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
> index 9b83ef6ea5e..d7b77fd6123 100644
> --- a/gcc/config/riscv/riscv-v.cc
> +++ b/gcc/config/riscv/riscv-v.cc
> @@ -98,6 +98,15 @@ private:
>expand_operand m_ops[MAX_OPERANDS];
>  };
>
> +static unsigned
> +get_sew (machine_mode mode)
> +{
> +  unsigned int sew = GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL
> +  ? 8
> +  : GET_MODE_BITSIZE (GET_MODE_INNER (mode));
> +  return sew;
> +}
> +
>  /* Return true if X is a const_vector with all duplicate elements, which is 
> in
> the range between MINVAL and MAXVAL.  */
>  bool
> @@ -109,13 +118,10 @@ const_vec_all_same_in_range_p (rtx x, HOST_WIDE_INT 
> minval,
>   && IN_RANGE (INTVAL (elt), minval, maxval));
>  }
>
> -static rtx
> -emit_vlmax_vsetvl (machine_mode vmode)
> +void
> +emit_vlmax_vsetvl (machine_mode vmode, rtx vl)
>  {
> -  rtx vl = gen_reg_rtx (Pmode);
> -  unsigned int sew = GET_MODE_CLASS (vmode) == MODE_VECTOR_BOOL
> -  ? 8
> -  : GET_MODE_BITSIZE (GET_MODE_INNER (vmode));
> +  unsigned int sew = get_sew (vmode);
>enum vlmul_type vlmul = get_vlmul (vmode);
>unsigned int ratio = calculate_ratio (sew, vlmul);
>
> @@ -125,8 +131,6 @@ emit_vlmax_vsetvl (machine_mode vmode)
>const0_rtx));
>else
>  emit_insn (gen_vlmax_avl (Pmode, vl, gen_int_mode (ratio, Pmode)));
> -
> -  return vl;
>  }
>
>  /* Calculate 

[PATCH] RISC-V: Fix ICE in LRA for LMUL < 1 vector spillings

2023-03-21 Thread juzhe . zhong
From: Ju-Zhe Zhong 

gcc/ChangeLog:

* config/riscv/riscv-protos.h (emit_vlmax_vsetvl): Define as global.
(emit_vlmax_op): Ditto.
* config/riscv/riscv-v.cc (get_sew): New function.
(emit_vlmax_vsetvl): Adapt function.
(emit_pred_op): Ditto.
(emit_vlmax_op): Ditto.
(emit_nonvlmax_op): Ditto.
(legitimize_move): Fix LRA ICE.
(gen_no_side_effects_vsetvl_rtx): Adapt function.
* config/riscv/vector.md (@mov_lra): New pattern.
(@mov_lra): Ditto.
(*mov_lra): Ditto.
(*mov_lra): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/base/binop_vv_constraint-4.c: Adapt testcase.
* gcc.target/riscv/rvv/base/binop_vv_constraint-6.c: Ditto.
* gcc.target/riscv/rvv/base/binop_vx_constraint-127.c: Ditto.
* gcc.target/riscv/rvv/base/spill-1.c: Ditto.
* gcc.target/riscv/rvv/base/spill-2.c: Ditto.
* gcc.target/riscv/rvv/base/spill-3.c: Ditto.
* gcc.target/riscv/rvv/base/spill-5.c: Ditto.
* gcc.target/riscv/rvv/base/spill-7.c: Ditto.
* g++.target/riscv/rvv/base/bug-18.C: New test.
* gcc.target/riscv/rvv/base/merge_constraint-3.c: New test.
* gcc.target/riscv/rvv/base/merge_constraint-4.c: New test.

---
 gcc/config/riscv/riscv-protos.h   |   2 +
 gcc/config/riscv/riscv-v.cc   |  67 +--
 gcc/config/riscv/vector.md|  56 ++
 .../g++.target/riscv/rvv/base/bug-18.C| 140 +++
 .../riscv/rvv/base/binop_vv_constraint-4.c|   1 +
 .../riscv/rvv/base/binop_vv_constraint-6.c|   1 +
 .../riscv/rvv/base/binop_vx_constraint-127.c  |   2 +-
 .../riscv/rvv/base/merge_constraint-3.c   |  95 ++
 .../riscv/rvv/base/merge_constraint-4.c   |  28 +++
 .../gcc.target/riscv/rvv/base/spill-1.c   | 168 +-
 .../gcc.target/riscv/rvv/base/spill-2.c   | 112 ++--
 .../gcc.target/riscv/rvv/base/spill-3.c   |  56 +++---
 .../gcc.target/riscv/rvv/base/spill-5.c   |  26 +--
 .../gcc.target/riscv/rvv/base/spill-7.c   | 161 +
 14 files changed, 636 insertions(+), 279 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/riscv/rvv/base/bug-18.C
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-3.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-4.c

diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h
index f35aaf35b48..060dddbdc22 100644
--- a/gcc/config/riscv/riscv-protos.h
+++ b/gcc/config/riscv/riscv-protos.h
@@ -157,7 +157,9 @@ bool check_builtin_call (location_t, vec, 
unsigned int,
   tree, unsigned int, tree *);
 bool const_vec_all_same_in_range_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
 bool legitimize_move (rtx, rtx, machine_mode);
+void emit_vlmax_vsetvl (machine_mode, rtx);
 void emit_vlmax_op (unsigned, rtx, rtx, machine_mode);
+void emit_vlmax_op (unsigned, rtx, rtx, rtx, machine_mode);
 void emit_nonvlmax_op (unsigned, rtx, rtx, rtx, machine_mode);
 enum vlmul_type get_vlmul (machine_mode);
 unsigned int get_ratio (machine_mode);
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index 9b83ef6ea5e..d7b77fd6123 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -98,6 +98,15 @@ private:
   expand_operand m_ops[MAX_OPERANDS];
 };
 
+static unsigned
+get_sew (machine_mode mode)
+{
+  unsigned int sew = GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL
+  ? 8
+  : GET_MODE_BITSIZE (GET_MODE_INNER (mode));
+  return sew;
+}
+
 /* Return true if X is a const_vector with all duplicate elements, which is in
the range between MINVAL and MAXVAL.  */
 bool
@@ -109,13 +118,10 @@ const_vec_all_same_in_range_p (rtx x, HOST_WIDE_INT 
minval,
  && IN_RANGE (INTVAL (elt), minval, maxval));
 }
 
-static rtx
-emit_vlmax_vsetvl (machine_mode vmode)
+void
+emit_vlmax_vsetvl (machine_mode vmode, rtx vl)
 {
-  rtx vl = gen_reg_rtx (Pmode);
-  unsigned int sew = GET_MODE_CLASS (vmode) == MODE_VECTOR_BOOL
-  ? 8
-  : GET_MODE_BITSIZE (GET_MODE_INNER (vmode));
+  unsigned int sew = get_sew (vmode);
   enum vlmul_type vlmul = get_vlmul (vmode);
   unsigned int ratio = calculate_ratio (sew, vlmul);
 
@@ -125,8 +131,6 @@ emit_vlmax_vsetvl (machine_mode vmode)
   const0_rtx));
   else
 emit_insn (gen_vlmax_avl (Pmode, vl, gen_int_mode (ratio, Pmode)));
-
-  return vl;
 }
 
 /* Calculate SEW/LMUL ratio.  */
@@ -166,7 +170,7 @@ calculate_ratio (unsigned int sew, enum vlmul_type vlmul)
 /* Emit an RVV unmask && vl mov from SRC to DEST.  */
 static void
 emit_pred_op (unsigned icode, rtx mask, rtx dest, rtx src, rtx len,
- machine_mode mask_mode)
+ machine_mode mask_mode, bool vlmax_p)
 {
   insn_expander<8> e;
   machine_mode mode = GET_MODE (dest);
@@