https://gcc.gnu.org/g:24689b84b8ec0c74c2b9a72ec4fb467069806bda

commit r15-2093-g24689b84b8ec0c74c2b9a72ec4fb467069806bda
Author: Richard Biener <rguent...@suse.de>
Date:   Wed Jul 17 11:42:13 2024 +0200

    tree-optimization/115959 - ICE with SLP condition reduction
    
    The following fixes how during reduction epilogue generation we
    gather conditional compares for condition reductions, thereby
    following the reduction chain via STMT_VINFO_REDUC_IDX.  The issue
    is that SLP nodes for COND_EXPRs can have either three or four
    children dependent on whether we have legacy GENERIC expressions
    in the transitional pattern GIMPLE for the COND_EXPR condition.
    
            PR tree-optimization/115959
            * tree-vect-loop.cc (vect_create_epilog_for_reduction):
            Get at the REDUC_IDX child in a safer way for COND_EXPR
            nodes.
    
            * gcc.dg/vect/pr115959.c: New testcase.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr115959.c | 14 ++++++++++++++
 gcc/tree-vect-loop.cc                | 10 +++++++---
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/vect/pr115959.c 
b/gcc/testsuite/gcc.dg/vect/pr115959.c
new file mode 100644
index 000000000000..181d55220182
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr115959.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+int a;
+_Bool *b;
+void f()
+{
+  int t = a;
+  for (int e = 0; e < 2048; e++)
+    {
+      if (!b[e])
+       t = 0;
+    }
+  a = t;
+}
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index b8124a321280..a464bc8607c2 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -6090,9 +6090,13 @@ vect_create_epilog_for_reduction (loop_vec_info 
loop_vinfo,
                    (std::make_pair (gimple_assign_rhs1 (vec_stmt),
                                     STMT_VINFO_REDUC_IDX (cond_info) == 2));
                }
-             /* ???  We probably want to have REDUC_IDX on the SLP node?  */
-             cond_node = SLP_TREE_CHILDREN
-                           (cond_node)[STMT_VINFO_REDUC_IDX (cond_info)];
+             /* ???  We probably want to have REDUC_IDX on the SLP node?
+                We have both three and four children COND_EXPR nodes
+                dependent on whether the comparison is still embedded
+                as GENERIC.  So work backwards.  */
+             int slp_reduc_idx = (SLP_TREE_CHILDREN (cond_node).length () - 3
+                                  + STMT_VINFO_REDUC_IDX (cond_info));
+             cond_node = SLP_TREE_CHILDREN (cond_node)[slp_reduc_idx];
            }
        }
       else

Reply via email to