[gcc r16-9459] tree-optimization/126457 - robustify reduction analysis
Richard Biener via Gcc-cvs <[email protected]> Thu, 30 Jul 2026 08:39:32 +0000 (GMT)
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:25acc01bc4299513d2f194eb7f92479a0b59a120 commit r16-9459-g25acc01bc4299513d2f194eb7f92479a0b59a120 Author: Richard Biener <[email protected]> Date: Wed Jul 29 11:32:48 2026 +0200 tree-optimization/126457 - robustify reduction analysis The following adds an early out for unsupported reduction operations to avoid ICEing when the assumption that the GIMPLE stmt operand number matches the SLP operand number breaks, as is for .CLZ with two operands. PR tree-optimization/126457 * tree-vect-loop.cc (vectorizable_reduction): Reject operations where not all operands correspond to a SLP child early. * gcc.dg/vect/vect-pr126457.c: New testcase. (cherry picked from commit 3e6ac9b8d87704323df1f12214c29725c4e5eb9d) Diff: --- gcc/testsuite/gcc.dg/vect/vect-pr126457.c | 16 ++++++++++++++++ gcc/tree-vect-loop.cc | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr126457.c b/gcc/testsuite/gcc.dg/vect/vect-pr126457.c new file mode 100644 index 000000000000..be441b304260 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-pr126457.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +int g6, g24; +_Bool f18_c6; +void f18() +{ + int a1; + int bb16 = 607229; +lbl_sw5: + bb16 = __builtin_clz(bb16); + f18_c6 = a1; + a1 = g24; + if (f18_c6) goto lbl_sw5; + g6 = __builtin_parity(bb16); + return; +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index f4708f399c92..810126196dfa 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -7224,6 +7224,16 @@ vectorizable_reduction (loop_vec_info loop_vinfo, return false; } + /* We'll verify the reduction operation only later - avoid + all operations that mismatch on the number of SLP children. */ + if (op.num_ops != SLP_TREE_CHILDREN (slp_for_stmt_info).length ()) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "unsupported reduction operation.\n"); + return false; + } + /* All uses but the last are expected to be defined in the loop. The last use is the reduction variable. In case of nested cycle this assumption is not true: we use reduc_index to record the index of the