https://gcc.gnu.org/g:246ecf81612518196f4aa45fe96f85831fe408ff

commit r16-2312-g246ecf81612518196f4aa45fe96f85831fe408ff
Author: Richard Biener <rguent...@suse.de>
Date:   Thu Jul 10 13:04:00 2025 +0200

    Reject single lane vector types for SLP build
    
    The following makes us never consider vector(1) T types for
    vectorization and ensures this during SLP build.  This is a
    long-standing issue for BB vectorization and when we remove
    early loop vector type setting we lose the single place we have
    that rejects this for loops.
    
    Once we implement partial loop vectorization we should revisit
    this, but then use the original scalar types for the unvectorized
    parts.
    
            * tree-vect-slp.cc (vect_build_slp_tree_1): Reject
            single-lane vector types.
    
            * gcc.dg/vect/bb-slp-39.c: Adjust.

Diff:
---
 gcc/testsuite/gcc.dg/vect/bb-slp-39.c |  3 +--
 gcc/tree-vect-slp.cc                  | 10 ++++++++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-39.c 
b/gcc/testsuite/gcc.dg/vect/bb-slp-39.c
index f05ce8f2847b..255bb1095dc5 100644
--- a/gcc/testsuite/gcc.dg/vect/bb-slp-39.c
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-39.c
@@ -16,5 +16,4 @@ void foo (double *p)
 }
 
 /* See that we vectorize three SLP instances.  */
-/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 3 "slp2" { 
target { ! { s390*-*-* riscv*-*-* } } } } } */
-/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 5 "slp2" { 
target {   s390*-*-* riscv*-*-* } } } } */
+/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 3 "slp2" } 
} */
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index ad75386926a8..fe67d4dbc46c 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -1114,6 +1114,16 @@ vect_build_slp_tree_1 (vec_info *vinfo, unsigned char 
*swap,
       matches[0] = false;
       return false;
     }
+  if (is_a <bb_vec_info> (vinfo)
+      && known_le (TYPE_VECTOR_SUBPARTS (vectype), 1U))
+    {
+      if (dump_enabled_p ())
+       dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                        "Build SLP failed: not using single lane "
+                        "vector type %T\n", vectype);
+      matches[0] = false;
+      return false;
+    }
   /* Record nunits required but continue analysis, producing matches[]
      as if nunits was not an issue.  This allows splitting of groups
      to happen.  */

Reply via email to