https://gcc.gnu.org/g:41e2fe9be1ff5ef2eafd49b30882898d26b9bf36
commit r16-3538-g41e2fe9be1ff5ef2eafd49b30882898d26b9bf36 Author: Richard Biener <rguent...@suse.de> Date: Wed Sep 3 10:04:58 2025 +0200 tree-optimization/121758 - fix pattern stmt REDUC_IDX updating The following fixes a corner case of pattern stmt STMT_VINFO_REDUC_IDX updating which happens auto-magically. When a 2nd pattern sequence uses defs from inside a prior pattern sequence then the first guess for the lookfor can be off. This happens when for example widening patterns use vect_get_internal_def, which looks into earlier patterns. PR tree-optimization/121758 * tree-vect-patterns.cc (vect_mark_pattern_stmts): Try harder to find a reduction continuation. * gcc.dg/vect/pr121758.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/vect/pr121758.c | 15 +++++++++++++++ gcc/tree-vect-patterns.cc | 30 ++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.dg/vect/pr121758.c b/gcc/testsuite/gcc.dg/vect/pr121758.c new file mode 100644 index 000000000000..b27bc672588a --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr121758.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +long g_2205, g_3005; +int g_3320; +void main() +{ + for (; g_2205; g_2205 += 1) + { + g_3005 = 0; + for (; g_3005 <= 8; g_3005 += 1) + g_3320 &= 611 & (unsigned char)g_3005; + } +} + +/* { dg-final { scan-tree-dump-not "failed to update reduction index" "vect" } } */ diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc index d0bf2f9e7990..41ca0f085f0e 100644 --- a/gcc/tree-vect-patterns.cc +++ b/gcc/tree-vect-patterns.cc @@ -7074,14 +7074,32 @@ vect_mark_pattern_stmts (vec_info *vinfo, { bool found = false; if (gimple_extract_op (s, &op)) - for (unsigned i = 0; i < op.num_ops; ++i) - if (op.ops[i] == lookfor) + { + for (unsigned i = 0; i < op.num_ops; ++i) + if (op.ops[i] == lookfor) + { + STMT_VINFO_REDUC_IDX (vinfo->lookup_stmt (s)) = i; + lookfor = gimple_get_lhs (s); + found = true; + break; + } + /* Try harder to find a mid-entry into an earlier pattern + sequence. This means that the initial 'lookfor' was + bogus. */ + if (!found) { - STMT_VINFO_REDUC_IDX (vinfo->lookup_stmt (s)) = i; - lookfor = gimple_get_lhs (s); - found = true; - break; + for (unsigned i = 0; i < op.num_ops; ++i) + if (TREE_CODE (op.ops[i]) == SSA_NAME) + if (auto def = vinfo->lookup_def (op.ops[i])) + if (vect_is_reduction (def)) + { + STMT_VINFO_REDUC_IDX (vinfo->lookup_stmt (s)) = i; + lookfor = gimple_get_lhs (s); + found = true; + break; + } } + } if (s == pattern_stmt) { if (!found && dump_enabled_p ())