This extends the PR65518 workaround to also apply for single-lane SLP.

        * tree-vect-stmts.cc (get_group_load_store_type): For SLP also
        check for the PR65518 single-element interleaving case as done in
        vect_grouped_load_supported.
---
 gcc/tree-vect-stmts.cc | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 1c30a0388ca..a01099d3456 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -2154,6 +2154,23 @@ get_group_load_store_type (vec_info *vinfo, 
stmt_vec_info stmt_info,
                }
              overrun_p = true;
            }
+
+         /* If this is single-element interleaving with an element
+            distance that leaves unused vector loads around punt - we
+            at least create very sub-optimal code in that case (and
+            blow up memory, see PR65518).  */
+         if (loop_vinfo
+             && *memory_access_type == VMAT_CONTIGUOUS
+             && SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
+             && single_element_p
+             && maybe_gt (group_size, TYPE_VECTOR_SUBPARTS (vectype)))
+           {
+             if (dump_enabled_p ())
+               dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                                "single-element interleaving not supported "
+                                "for not adjacent vector loads\n");
+             return false;
+           }
        }
     }
   else
-- 
2.35.3

Reply via email to