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 ())

Reply via email to