https://gcc.gnu.org/g:412c156d78c764d4aec3e94469ba5a4c068cee4c

commit r15-3601-g412c156d78c764d4aec3e94469ba5a4c068cee4c
Author: Richard Biener <rguent...@suse.de>
Date:   Thu Sep 12 11:31:59 2024 +0200

    Abort loop SLP analysis quicker
    
    As we can't cope with removed SLP instances during analysis there's
    no point in doing that or even continuing analysis of SLP instances
    after a failure.  The following makes us abort early.
    
            * tree-vect-slp.cc (vect_slp_analyze_operations): When
            doing loop analysis fail after the first failed SLP
            instance.  Only remove instances when doing BB vectorization.
            * tree-vect-loop.cc (vect_analyze_loop_2): Check whether
            vect_slp_analyze_operations failed instead of checking
            the number of SLP instances remaining.

Diff:
---
 gcc/tree-vect-loop.cc | 10 ++++------
 gcc/tree-vect-slp.cc  | 10 +++++++++-
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 65d7ed51067e..cc15492f6a01 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -2947,12 +2947,10 @@ start_over:
 
   if (slp)
     {
-      /* Analyze operations in the SLP instances.  Note this may
-        remove unsupported SLP instances which makes the above
-        SLP kind detection invalid.  */
-      unsigned old_size = LOOP_VINFO_SLP_INSTANCES (loop_vinfo).length ();
-      vect_slp_analyze_operations (loop_vinfo);
-      if (LOOP_VINFO_SLP_INSTANCES (loop_vinfo).length () != old_size)
+      /* Analyze operations in the SLP instances.  We can't simply
+        remove unsupported SLP instances as this makes the above
+        SLP kind detection invalid and might also affect the VF.  */
+      if (! vect_slp_analyze_operations (loop_vinfo))
        {
          ok = opt_result::failure_at (vect_location,
                                       "unsupported SLP instances\n");
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 975949ccbd14..4fcb9e2fa2bb 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -7976,19 +7976,27 @@ vect_slp_analyze_operations (vec_info *vinfo)
          || (SLP_INSTANCE_KIND (instance) == slp_inst_kind_bb_reduc
              && !vectorizable_bb_reduc_epilogue (instance, &cost_vec)))
         {
+         cost_vec.release ();
          slp_tree node = SLP_INSTANCE_TREE (instance);
          stmt_vec_info stmt_info;
          if (!SLP_INSTANCE_ROOT_STMTS (instance).is_empty ())
            stmt_info = SLP_INSTANCE_ROOT_STMTS (instance)[0];
          else
            stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
+         if (is_a <loop_vec_info> (vinfo))
+           {
+             if (dump_enabled_p ())
+               dump_printf_loc (MSG_NOTE, vect_location,
+                                "unsupported SLP instance starting from: %G",
+                                stmt_info->stmt);
+             return false;
+           }
          if (dump_enabled_p ())
            dump_printf_loc (MSG_NOTE, vect_location,
                             "removing SLP instance operations starting from: 
%G",
                             stmt_info->stmt);
          vect_free_slp_instance (instance);
           vinfo->slp_instances.ordered_remove (i);
-         cost_vec.release ();
          while (!visited_vec.is_empty ())
            visited.remove (visited_vec.pop ());
        }

Reply via email to