https://gcc.gnu.org/g:7f9be55a4630134a237219af9cc8143e02080380
commit r15-1407-g7f9be55a4630134a237219af9cc8143e02080380 Author: Richard Biener <rguent...@suse.de> Date: Tue Jun 18 14:00:52 2024 +0200 tree-optimization/115537 - ICE with SLP condition reduction vectorization The condition rejecting "multiple-type" SLP condition reduction lacks handling EXTRACT_LAST reductions. PR tree-optimization/115537 * tree-vect-loop.cc (vectorizable_reduction): Also reject SLP condition reductions of EXTRACT_LAST kind when multiple statement copies are involved. * gcc.dg/vect/pr115537.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/vect/pr115537.c | 19 +++++++++++++++++++ gcc/tree-vect-loop.cc | 5 +++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/gcc/testsuite/gcc.dg/vect/pr115537.c b/gcc/testsuite/gcc.dg/vect/pr115537.c new file mode 100644 index 000000000000..99ed467feb88 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr115537.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-mcpu=neoverse-n1" { target aarch64*-*-* } } */ + +char *a; +int b; +void c() +{ + int d = 0, e = 0, f; + for (; f; ++f) + if (a[f] == 5) + ; + else if (a[f]) + e = 1; + else + d = 1; + if (d) + if (e) + b = 0; +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 7c79e9da1060..eeb75c09e91a 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -8083,13 +8083,14 @@ vectorizable_reduction (loop_vec_info loop_vinfo, if ((reduction_type == COND_REDUCTION || reduction_type == INTEGER_INDUC_COND_REDUCTION - || reduction_type == CONST_COND_REDUCTION) + || reduction_type == CONST_COND_REDUCTION + || reduction_type == EXTRACT_LAST_REDUCTION) && slp_node && SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) > 1) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "multiple types in condition reduction reduction.\n"); + "multiple types in condition reduction.\n"); return false; }