From: Richard Biener Date: Tue, 18 Jun 2024 12:00:52 +0000 (+0200) Subject: tree-optimization/115537 - ICE with SLP condition reduction vectorization X-Git-Tag: basepoints/gcc-16~8146 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f9be55a4630134a237219af9cc8143e02080380;p=thirdparty%2Fgcc.git 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 --git a/gcc/testsuite/gcc.dg/vect/pr115537.c b/gcc/testsuite/gcc.dg/vect/pr115537.c new file mode 100644 index 00000000000..99ed467feb8 --- /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 7c79e9da106..eeb75c09e91 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; }