]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Do not rely on non-SLP analysis for SLP outer loop vectorization
authorRichard Biener <rguenther@suse.de>
Thu, 30 Jan 2025 13:52:14 +0000 (14:52 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 31 Jan 2025 08:11:04 +0000 (09:11 +0100)
We end up relying on non-SLP analysis of the inner loop LC PHI to
set the vectorizationb method for SLP since vectorizable_reduction
claims responsibility.  The following fixes this.

* tree-vect-loop.cc (vect_analyze_loop_operations): Only
call vectorizable_lc_phi when not PURE_SLP.
(vectorizable_reduction): Do not claim having handled
the inner loop LC PHI for outer loop vectorization.

gcc/tree-vect-loop.cc

index ce674a71e8a0477729aee063aa0dbc4bad16704b..03426207879fe506f7d31c61512c74fe27fb8281 100644 (file)
@@ -2171,6 +2171,7 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo)
                  if ((STMT_VINFO_DEF_TYPE (stmt_info) == vect_internal_def
                       || (STMT_VINFO_DEF_TYPE (stmt_info)
                           == vect_double_reduction_def))
+                     && ! PURE_SLP_STMT (stmt_info)
                      && !vectorizable_lc_phi (loop_vinfo,
                                               stmt_info, NULL, NULL))
                    return opt_result::failure_at (phi, "unsupported phi\n");
@@ -7770,9 +7771,10 @@ vectorizable_reduction (loop_vec_info loop_vinfo,
        {
          /* For SLP we arrive here for both the inner loop LC PHI and
             the outer loop PHI.  The latter is what we want to analyze
-            the reduction with.  */
+            the reduction with.  The LC PHI is handled by
+            vectorizable_lc_phi.  */
          gcc_assert (slp_node);
-         return true;
+         return gimple_phi_num_args (as_a <gphi *> (stmt_info->stmt)) == 2;
        }
       use_operand_p use_p;
       gimple *use_stmt;