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.target/riscv/rvv/autovec/pr110989.c          | 11 +++++++++++
 gcc/tree-vect-stmts.cc                               | 12 +++---------
 2 files changed, 14 insertions(+), 9 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..89607a98f99 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -9125,11 +9125,8 @@ vectorizable_store (vec_info *vinfo,
                  if (!final_len)
                    {
                      /* 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,
-                                        TYPE_VECTOR_SUBPARTS (vectype));
+                        MASK_LEN_STORE if LOOP_LENS is invalid.  */
+                     final_len = size_int (TYPE_VECTOR_SUBPARTS (vectype));
                    }
                  if (!final_mask)
                    {
@@ -10713,11 +10710,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,
-                                              TYPE_VECTOR_SUBPARTS (vectype));
+                             = size_int (TYPE_VECTOR_SUBPARTS (vectype));
                          }
                        if (!final_mask)
                          {
-- 
2.36.3

Reply via email to