VECT: Fix ICE on MASK_LEN_{LOAD, STORE} when no LEN recorded[PR110989]

Message ID 20230811114919.2556172-1-juzhe.zhong@rivai.ai
State Unresolved
Headers
Series VECT: Fix ICE on MASK_LEN_{LOAD, STORE} when no LEN recorded[PR110989] |

Checks

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

Commit Message

juzhe.zhong@rivai.ai Aug. 11, 2023, 11:49 a.m. UTC
  This patch fixes bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110989

This ICE is caused because of this situation:

mask__49.21_99 = vect__17.19_96 == { 0.0, ... };
...
vect__6.24_107 = .MASK_LEN_LOAD (vectp.22_105, 32B, mask__49.21_99, POLY_INT_CST [2, 2], 0);

The MASK_LEN_LOAD is using real MASK which is produced by the EQ comparison wheras the LEN
is the dummy LEN which is the vectorization factor.

In this situation, we didn't enter 'vect_record_loop_len' since there is no LEN loop control.
Then 'LOOP_VINFO_RGROUP_IV_TYPE' is not suitable type for 'build_int_cst' used for producing
LEN argument for 'MASK_LEN_LOAD', so use sizetype instead which is perfectly matching
RVV length requirement.

        PR middle-end/110989

gcc/ChangeLog:

        * tree-vect-stmts.cc (vectorizable_store): Replace iv_type with sizetype.
        (vectorizable_load): Ditto.

gcc/testsuite/ChangeLog:

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

---
 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c | 11 +++++++++++
 gcc/tree-vect-stmts.cc                                |  7 ++-----
 2 files changed, 13 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
  

Comments

Richard Biener Aug. 11, 2023, 12:16 p.m. UTC | #1
On Fri, 11 Aug 2023, Juzhe-Zhong wrote:

> This patch fixes bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110989
> 
> This ICE is caused because of this situation:
> 
> mask__49.21_99 = vect__17.19_96 == { 0.0, ... };
> ...
> vect__6.24_107 = .MASK_LEN_LOAD (vectp.22_105, 32B, mask__49.21_99, POLY_INT_CST [2, 2], 0);
> 
> The MASK_LEN_LOAD is using real MASK which is produced by the EQ comparison wheras the LEN
> is the dummy LEN which is the vectorization factor.
> 
> In this situation, we didn't enter 'vect_record_loop_len' since there is no LEN loop control.
> Then 'LOOP_VINFO_RGROUP_IV_TYPE' is not suitable type for 'build_int_cst' used for producing
> LEN argument for 'MASK_LEN_LOAD', so use sizetype instead which is perfectly matching
> RVV length requirement.

Looks reasonable.  Note there is size_int (...) you could use to shorten
the code.

Thanks,
Richard.

>         PR middle-end/110989
> 
> gcc/ChangeLog:
> 
>         * tree-vect-stmts.cc (vectorizable_store): Replace iv_type with sizetype.
>         (vectorizable_load): Ditto.
> 
> gcc/testsuite/ChangeLog:
> 
>         * gcc.target/riscv/rvv/autovec/pr110989.c: New test.
> 
> ---
>  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c | 11 +++++++++++
>  gcc/tree-vect-stmts.cc                                |  7 ++-----
>  2 files changed, 13 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
> 
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
> new file mode 100644
> index 00000000000..cf3b247e604
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-march=rv64gcv -mabi=lp64d --param=riscv-autovec-preference=scalable -Ofast" } */
> +
> +int a, b, c;
> +double *d;
> +void e() {
> +  double f;
> +  for (; c; c++, d--)
> +    f = *d ?: *(&a + c);
> +  b = f;
> +}
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 398fbe945e5..e0e2083d022 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -9126,9 +9126,8 @@ vectorizable_store (vec_info *vinfo,
>  		    {
>  		      /* Pass VF value to 'len' argument of
>  		         MASK_LEN_STORE if LOOP_LENS is invalid.  */
> -		      tree iv_type = LOOP_VINFO_RGROUP_IV_TYPE (loop_vinfo);
>  		      final_len
> -			= build_int_cst (iv_type,
> +			= build_int_cst (sizetype,
>  					 TYPE_VECTOR_SUBPARTS (vectype));
>  		    }
>  		  if (!final_mask)
> @@ -10713,10 +10712,8 @@ vectorizable_load (vec_info *vinfo,
>  			  {
>  			    /* Pass VF value to 'len' argument of
>  			       MASK_LEN_LOAD if LOOP_LENS is invalid.  */
> -			    tree iv_type
> -			      = LOOP_VINFO_RGROUP_IV_TYPE (loop_vinfo);
>  			    final_len
> -			      = build_int_cst (iv_type,
> +			      = build_int_cst (sizetype,
>  					       TYPE_VECTOR_SUBPARTS (vectype));
>  			  }
>  			if (!final_mask)
>
  

Patch

diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
new file mode 100644
index 00000000000..cf3b247e604
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d --param=riscv-autovec-preference=scalable -Ofast" } */
+
+int a, b, c;
+double *d;
+void e() {
+  double f;
+  for (; c; c++, d--)
+    f = *d ?: *(&a + c);
+  b = f;
+}
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 398fbe945e5..e0e2083d022 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -9126,9 +9126,8 @@  vectorizable_store (vec_info *vinfo,
 		    {
 		      /* Pass VF value to 'len' argument of
 		         MASK_LEN_STORE if LOOP_LENS is invalid.  */
-		      tree iv_type = LOOP_VINFO_RGROUP_IV_TYPE (loop_vinfo);
 		      final_len
-			= build_int_cst (iv_type,
+			= build_int_cst (sizetype,
 					 TYPE_VECTOR_SUBPARTS (vectype));
 		    }
 		  if (!final_mask)
@@ -10713,10 +10712,8 @@  vectorizable_load (vec_info *vinfo,
 			  {
 			    /* Pass VF value to 'len' argument of
 			       MASK_LEN_LOAD if LOOP_LENS is invalid.  */
-			    tree iv_type
-			      = LOOP_VINFO_RGROUP_IV_TYPE (loop_vinfo);
 			    final_len
-			      = build_int_cst (iv_type,
+			      = build_int_cst (sizetype,
 					       TYPE_VECTOR_SUBPARTS (vectype));
 			  }
 			if (!final_mask)