diff options
author | Richard Biener <rguenther@suse.de> | 2024-03-26 09:39:30 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-03-26 10:38:04 +0100 |
commit | 226a220d0056396e825e12435cc0da52cbd5ac56 (patch) | |
tree | 71b540fbe63967bc5d710649bba85236f6dea05b /gcc | |
parent | 94b91b2786531ed8e2d07a6ad1191b5dfa0141e5 (diff) | |
download | gcc-226a220d0056396e825e12435cc0da52cbd5ac56.zip gcc-226a220d0056396e825e12435cc0da52cbd5ac56.tar.gz gcc-226a220d0056396e825e12435cc0da52cbd5ac56.tar.bz2 |
tree-optimization/114464 - verify types in recurrence vectorization
The following adds missing verification of vector type compatibility
to recurrence vectorization.
PR tree-optimization/114464
* tree-vect-loop.cc (vectorizable_recurr): Verify the latch
vector type is compatible with what we chose for the recurrence.
* g++.dg/vect/pr114464.cc: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr114464.cc | 11 | ||||
-rw-r--r-- | gcc/tree-vect-loop.cc | 22 |
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/vect/pr114464.cc b/gcc/testsuite/g++.dg/vect/pr114464.cc new file mode 100644 index 0000000..0d872aa --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr114464.cc @@ -0,0 +1,11 @@ +// { dg-do compile } + +void h(unsigned char *scratch, bool carry) +{ + for (int i = 0; i < 16; i++) { + bool b = scratch[i] <<= 1; + if (carry) + scratch[i] |= 1; + carry = b; + } +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 2921a9e..f33629e 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -9197,6 +9197,28 @@ vectorizable_recurr (loop_vec_info loop_vinfo, stmt_vec_info stmt_info, return false; } } + + /* Verify we have set up compatible types. */ + edge le = loop_latch_edge (LOOP_VINFO_LOOP (loop_vinfo)); + tree latch_vectype = NULL_TREE; + if (slp_node) + { + slp_tree latch_def = SLP_TREE_CHILDREN (slp_node)[le->dest_idx]; + latch_vectype = SLP_TREE_VECTYPE (latch_def); + } + else + { + tree latch_def = PHI_ARG_DEF_FROM_EDGE (phi, le); + if (TREE_CODE (latch_def) == SSA_NAME) + { + stmt_vec_info latch_def_info = loop_vinfo->lookup_def (latch_def); + latch_def_info = vect_stmt_to_vectorize (latch_def_info); + latch_vectype = STMT_VINFO_VECTYPE (latch_def_info); + } + } + if (!types_compatible_p (latch_vectype, vectype)) + return false; + /* The recurrence costs the initialization vector and one permute for each copy. */ unsigned prologue_cost = record_stmt_cost (cost_vec, 1, scalar_to_vec, |