[gcc r16-9457] tree-optimization/126404 - fixup conversion detection in reductions
Richard Biener via Gcc-cvs <[email protected]> Thu, 30 Jul 2026 08:39:22 +0000 (GMT)
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:8801728ac99a19763df4851e682f1cacfe7975fc commit r16-9457-g8801728ac99a19763df4851e682f1cacfe7975fc Author: Richard Biener <[email protected]> Date: Mon Jul 27 19:24:32 2026 +0200 tree-optimization/126404 - fixup conversion detection in reductions The following makes sure to check the pattern stmt against being a conversion to skip but the original stmt for a mismatch in code. PR tree-optimization/126404 * tree-vect-slp.cc (vect_analyze_slp_reduc_chain): Fixup conversion detection. * gcc.dg/vect/vect-pr126404.c: New testcase. (cherry picked from commit 3cd23c9fd60854cd9d160ce3b341a819025bfeb8) Diff: --- gcc/testsuite/gcc.dg/vect/vect-pr126404.c | 14 ++++++++++++++ gcc/tree-vect-slp.cc | 7 ++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr126404.c b/gcc/testsuite/gcc.dg/vect/vect-pr126404.c new file mode 100644 index 000000000000..4657d34baf38 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-pr126404.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +unsigned ff(int g7) +{ + int v3 = 8; + int ob13; + int ov14; + do { + ob13 = __builtin_add_overflow(2, g7, &ov14); + g7 = 0; + v3 = __builtin_ctz(v3); + } while (ob13); + return v3; +} diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index c114c5d6175e..48bfd87f8961 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -4237,7 +4237,7 @@ vect_analyze_slp_reduc_chain (loop_vec_info vinfo, do { stmt_vec_info stmt = next_stmt; - gimple_match_op op; + gimple_match_op op, orig_op; if (!gimple_extract_op (STMT_VINFO_STMT (stmt), &op)) gcc_unreachable (); tree reduc_def = gimple_arg (STMT_VINFO_STMT (stmt), @@ -4245,14 +4245,15 @@ vect_analyze_slp_reduc_chain (loop_vec_info vinfo, next_stmt = vect_stmt_to_vectorize (vinfo->lookup_def (reduc_def)); gcc_assert (is_a <gphi *> (STMT_VINFO_STMT (next_stmt)) || STMT_VINFO_REDUC_IDX (next_stmt) != -1); - if (!gimple_extract_op (STMT_VINFO_STMT (vect_orig_stmt (stmt)), &op)) + if (!gimple_extract_op (STMT_VINFO_STMT (vect_orig_stmt (stmt)), + &orig_op)) gcc_unreachable (); if (CONVERT_EXPR_CODE_P (op.code) && tree_nop_conversion_p (op.type, TREE_TYPE (op.ops[0])) && (first || is_a <gphi *> (STMT_VINFO_STMT (next_stmt)))) ; - else if (code != op.code) + else if (code != orig_op.code) { fail = true; break;