From: Richard Biener Date: Tue, 19 Aug 2025 10:31:53 +0000 (+0200) Subject: tree-optimization/121592 - failed reduction SLP discovery X-Git-Tag: basepoints/gcc-17~5522 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=05284f73cff1685e2513b415e8da644193acf8cd;p=thirdparty%2Fgcc.git tree-optimization/121592 - failed reduction SLP discovery The testcase in the PR shows that when we have a reduction chain with a wrapped conversion we fail to properly fall back to a regular reduction, resulting in wrong-code. The following fixes this by failing discovery. The testcase has other issues, so I'm not including it here. PR tree-optimization/121592 * tree-vect-slp.cc (vect_analyze_slp): When SLP reduction chain discovery fails, fail overall when the tail of the chain isn't also the entry for the non-SLP reduction. --- diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 05363f89cf4..d5adb8baf87 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -5005,6 +5005,11 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size, vinfo = next; } STMT_VINFO_DEF_TYPE (first_element) = vect_internal_def; + /* ??? When there's a conversion around the reduction + chain 'last' isn't the entry of the reduction. */ + if (STMT_VINFO_DEF_TYPE (last) != vect_reduction_def) + return opt_result::failure_at (vect_location, + "SLP build failed.\n"); /* It can be still vectorized as part of an SLP reduction. */ loop_vinfo->reductions.safe_push (last); }