aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-03-26 09:39:30 +0100
committerRichard Biener <rguenther@suse.de>2024-03-26 10:38:04 +0100
commit226a220d0056396e825e12435cc0da52cbd5ac56 (patch)
tree71b540fbe63967bc5d710649bba85236f6dea05b /gcc
parent94b91b2786531ed8e2d07a6ad1191b5dfa0141e5 (diff)
downloadgcc-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.cc11
-rw-r--r--gcc/tree-vect-loop.cc22
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,