aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>2023-08-11 21:55:42 +0800
committerPan Li <pan2.li@intel.com>2023-08-12 05:50:35 +0800
commit5bfb5e772f6cf121563f08d27d2c652ea469bbfb (patch)
tree65fc4c1daebc8255890105bcadb833c3e32018bc
parent2b1b804de2687c9f705cc3625e467dfa18723a45 (diff)
downloadgcc-5bfb5e772f6cf121563f08d27d2c652ea469bbfb.zip
gcc-5bfb5e772f6cf121563f08d27d2c652ea469bbfb.tar.gz
gcc-5bfb5e772f6cf121563f08d27d2c652ea469bbfb.tar.bz2
VECT: Fix ICE on MASK_LEN_{LOAD, STORE} when no LEN recorded[PR110989]
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.
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/pr110989.c11
-rw-r--r--gcc/tree-vect-stmts.cc12
2 files changed, 14 insertions, 9 deletions
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 0000000..cf3b247
--- /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 398fbe9..89607a9 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)
{