]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
VECT: Fix ICE on MASK_LEN_{LOAD, STORE} when no LEN recorded[PR110989]
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>
Fri, 11 Aug 2023 13:55:42 +0000 (21:55 +0800)
committerPan Li <pan2.li@intel.com>
Fri, 11 Aug 2023 21:50:35 +0000 (05:50 +0800)
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.

gcc/ChangeLog:
PR middle-end/110989
* tree-vect-stmts.cc (vectorizable_store): Replace iv_type with sizetype.
(vectorizable_load): Ditto.

gcc/testsuite/ChangeLog:
PR middle-end/110989
* gcc.target/riscv/rvv/autovec/pr110989.c: New test.

gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c [new file with mode: 0644]
gcc/tree-vect-stmts.cc

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 (file)
index 0000000..cf3b247
--- /dev/null
@@ -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;
+}
index 398fbe945e581c6d4eb93a57678f826acee6e4a9..89607a98f9972965af9ed3efe98e6c1594c03c06 100644 (file)
@@ -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)
                          {