From 41e2fe9be1ff5ef2eafd49b30882898d26b9bf36 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 3 Sep 2025 10:04:58 +0200 Subject: 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. --- gcc/testsuite/gcc.dg/vect/pr121758.c | 15 +++++++++++++++ gcc/tree-vect-patterns.cc | 30 ++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr121758.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/vect/pr121758.c b/gcc/testsuite/gcc.dg/vect/pr121758.c new file mode 100644 index 0000000..b27bc67 --- /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 d0bf2f9..41ca0f0 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 ()) -- cgit v1.1