https://gcc.gnu.org/g:24689b84b8ec0c74c2b9a72ec4fb467069806bda
commit r15-2093-g24689b84b8ec0c74c2b9a72ec4fb467069806bda Author: Richard Biener <rguent...@suse.de> Date: Wed Jul 17 11:42:13 2024 +0200 tree-optimization/115959 - ICE with SLP condition reduction The following fixes how during reduction epilogue generation we gather conditional compares for condition reductions, thereby following the reduction chain via STMT_VINFO_REDUC_IDX. The issue is that SLP nodes for COND_EXPRs can have either three or four children dependent on whether we have legacy GENERIC expressions in the transitional pattern GIMPLE for the COND_EXPR condition. PR tree-optimization/115959 * tree-vect-loop.cc (vect_create_epilog_for_reduction): Get at the REDUC_IDX child in a safer way for COND_EXPR nodes. * gcc.dg/vect/pr115959.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/vect/pr115959.c | 14 ++++++++++++++ gcc/tree-vect-loop.cc | 10 +++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gcc/testsuite/gcc.dg/vect/pr115959.c b/gcc/testsuite/gcc.dg/vect/pr115959.c new file mode 100644 index 000000000000..181d55220182 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr115959.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +int a; +_Bool *b; +void f() +{ + int t = a; + for (int e = 0; e < 2048; e++) + { + if (!b[e]) + t = 0; + } + a = t; +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index b8124a321280..a464bc8607c2 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -6090,9 +6090,13 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo, (std::make_pair (gimple_assign_rhs1 (vec_stmt), STMT_VINFO_REDUC_IDX (cond_info) == 2)); } - /* ??? We probably want to have REDUC_IDX on the SLP node? */ - cond_node = SLP_TREE_CHILDREN - (cond_node)[STMT_VINFO_REDUC_IDX (cond_info)]; + /* ??? We probably want to have REDUC_IDX on the SLP node? + We have both three and four children COND_EXPR nodes + dependent on whether the comparison is still embedded + as GENERIC. So work backwards. */ + int slp_reduc_idx = (SLP_TREE_CHILDREN (cond_node).length () - 3 + + STMT_VINFO_REDUC_IDX (cond_info)); + cond_node = SLP_TREE_CHILDREN (cond_node)[slp_reduc_idx]; } } else