diff mbox series

tree-optimization/103864 - SLP reduction of reductions with conversions

Message ID 94o8qr6p-7o24-o6qn-1489-r89sor621rpo@fhfr.qr
State New
Headers show
Series tree-optimization/103864 - SLP reduction of reductions with conversions | expand

Commit Message

Richard Biener Jan. 4, 2022, 9:16 a.m. UTC
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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

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 | 16 ++++++++++++++++
 gcc/tree-vect-slp.c                  | 18 +++++++++---------
 2 files changed, 25 insertions(+), 9 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/pr103864.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/vect/pr103864.c b/gcc/testsuite/gcc.dg/vect/pr103864.c
new file mode 100644
index 00000000000..464d5731a42
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr103864.c
@@ -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;
+    }
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 3566752c657..c3a1681d7c6 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -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.  */