]> gcc.gnu.org Git - gcc.git/commitdiff
tree-optimization/103864 - SLP reduction of reductions with conversions
authorRichard Biener <rguenther@suse.de>
Tue, 4 Jan 2022 09:12:47 +0000 (10:12 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 4 Jan 2022 09:16:28 +0000 (10:16 +0100)
This generalizes the fix for PR103544 to also cover reductions that
are not reduction chains and does not consider reductions wrapped in
sign conversions for SLP reduction handling.

2022-01-04  Richard Biener  <rguenther@suse.de>

PR tree-optimization/103864
PR tree-optimization/103544
* tree-vect-slp.c (vect_analyze_slp_instance): Exclude
reductions wrapped in conversions from SLP handling.
(vect_analyze_slp): Revert PR103544 change.

* gcc.dg/vect/pr103864.c: New testcase.

gcc/testsuite/gcc.dg/vect/pr103864.c [new file with mode: 0644]
gcc/tree-vect-slp.c

diff --git a/gcc/testsuite/gcc.dg/vect/pr103864.c b/gcc/testsuite/gcc.dg/vect/pr103864.c
new file mode 100644 (file)
index 0000000..464d573
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3 -fno-tree-reassoc" } */
+
+void
+crash_me (short int *crash_me_result, int i, char crash_me_ptr_0)
+{
+  while (i < 1)
+    {
+      int j;
+
+      for (j = 0; j < 2; ++j)
+        crash_me_result[j] += crash_me_ptr_0 + 1;
+
+      i += 3;
+    }
+}
index 3566752c6574c07c1bb579ba298d36001bf5728c..c3a1681d7c6495ae98084288bf335956effd6893 100644 (file)
@@ -3325,8 +3325,13 @@ vect_analyze_slp_instance (vec_info *vinfo,
        = as_a <loop_vec_info> (vinfo)->reductions;
       scalar_stmts.create (reductions.length ());
       for (i = 0; reductions.iterate (i, &next_info); i++)
-       if (STMT_VINFO_RELEVANT_P (next_info)
-           || STMT_VINFO_LIVE_P (next_info))
+       if ((STMT_VINFO_RELEVANT_P (next_info)
+            || STMT_VINFO_LIVE_P (next_info))
+           /* ???  Make sure we didn't skip a conversion around a reduction
+              path.  In that case we'd have to reverse engineer that conversion
+              stmt following the chain using reduc_idx and from the PHI
+              using reduc_def.  */
+           && STMT_VINFO_DEF_TYPE (next_info) == vect_reduction_def)
          scalar_stmts.quick_push (next_info);
       /* If less than two were relevant/live there's nothing to SLP.  */
       if (scalar_stmts.length () < 2)
@@ -3419,13 +3424,8 @@ vect_analyze_slp (vec_info *vinfo, unsigned max_tree_size)
                vinfo = next;
              }
            STMT_VINFO_DEF_TYPE (first_element) = vect_internal_def;
-           /* It can be still vectorized as part of an SLP reduction.
-              ???  But only if we didn't skip a conversion around the group.
-              In that case we'd have to reverse engineer that conversion
-              stmt following the chain using reduc_idx and from the PHI
-              using reduc_def.  */
-           if (STMT_VINFO_DEF_TYPE (last) == vect_reduction_def)
-             loop_vinfo->reductions.safe_push (last);
+           /* It can be still vectorized as part of an SLP reduction.  */
+           loop_vinfo->reductions.safe_push (last);
          }
 
       /* Find SLP sequences starting from groups of reductions.  */
This page took 0.082149 seconds and 5 git commands to generate.