diff options
author | Richard Biener <rguenther@suse.de> | 2025-08-19 12:31:53 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2025-08-19 13:45:58 +0200 |
commit | 05284f73cff1685e2513b415e8da644193acf8cd (patch) | |
tree | 673bfadb6234376aae265a6a8a3f3d36e538cc01 | |
parent | fc8e2846c24bd62091b31cc35c143b990e79d557 (diff) | |
download | gcc-05284f73cff1685e2513b415e8da644193acf8cd.zip gcc-05284f73cff1685e2513b415e8da644193acf8cd.tar.gz gcc-05284f73cff1685e2513b415e8da644193acf8cd.tar.bz2 |
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.
-rw-r--r-- | gcc/tree-vect-slp.cc | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 05363f8..d5adb8b 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); } |