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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        * 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 | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index ce674a71e8a..03426207879 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -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;
-- 
2.43.0

Reply via email to