]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/114464 - verify types in recurrence vectorization
authorRichard Biener <rguenther@suse.de>
Tue, 26 Mar 2024 08:39:30 +0000 (09:39 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 26 Mar 2024 09:38:04 +0000 (10:38 +0100)
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.

gcc/testsuite/g++.dg/vect/pr114464.cc [new file with mode: 0644]
gcc/tree-vect-loop.cc

diff --git a/gcc/testsuite/g++.dg/vect/pr114464.cc b/gcc/testsuite/g++.dg/vect/pr114464.cc
new file mode 100644 (file)
index 0000000..0d872aa
--- /dev/null
@@ -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;
+  }
+}
index 2921a9e6aa125146b6ef964440b52a4ad90e3347..f33629e9b045eb5fe4a19dfd7d2086ed1965acda 100644 (file)
@@ -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,