tree-optimization/93397 delay converted reduction chain adjustment
diff mbox series

Message ID nycvar.YFH.7.76.2001231501440.18835@zhemvz.fhfr.qr
State New
Headers show
Series
  • tree-optimization/93397 delay converted reduction chain adjustment
Related show

Commit Message

Richard Biener Jan. 23, 2020, 2:02 p.m. UTC
The following delays adjusting the SLP graph for converted reduction
chains to a point where the SLP build no longer can fail since we
otherwise fail to undo marking the conversion as a group.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2020-01-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/93397
	* tree-vect-slp.c (vect_analyze_slp_instance): Delay
	converted reduction chain SLP graph adjustment.

	* gcc.dg/torture/pr93397.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr93397.c | 14 ++++++++
 gcc/tree-vect-slp.c                    | 58 ++++++++++++++++++----------------
 2 files changed, 44 insertions(+), 28 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr93397.c

Patch
diff mbox series

diff --git a/gcc/testsuite/gcc.dg/torture/pr93397.c b/gcc/testsuite/gcc.dg/torture/pr93397.c
new file mode 100644
index 00000000000..c19b7983e58
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr93397.c
@@ -0,0 +1,14 @@ 
+/* { dg-do compile } */
+/* { dg-additional-options "-ftree-vectorize" } */
+
+char
+bn (char *vu)
+{
+  int b6;
+  char wv = 0;
+
+  for (b6 = 0; b6 <= 64; b6 += 4)
+    wv += vu[b6] + vu[b6 + 1];
+
+  return wv;
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index cebaa811dd2..b13beeb3689 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2210,34 +2210,6 @@  vect_analyze_slp_instance (vec_info *vinfo,
 			      &tree_size, bst_map);
   if (node != NULL)
     {
-      /* If this is a reduction chain with a conversion in front
-         amend the SLP tree with a node for that.  */
-      if (!dr
-	  && REDUC_GROUP_FIRST_ELEMENT (stmt_info)
-	  && STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def)
-	{
-	  /* Get at the conversion stmt - we know it's the single use
-	     of the last stmt of the reduction chain.  */
-	  gimple *tem = vect_orig_stmt (scalar_stmts[group_size - 1])->stmt;
-	  use_operand_p use_p;
-	  gimple *use_stmt;
-	  bool r = single_imm_use (gimple_assign_lhs (tem), &use_p, &use_stmt);
-	  gcc_assert (r);
-	  next_info = vinfo->lookup_stmt (use_stmt);
-	  next_info = vect_stmt_to_vectorize (next_info);
-	  scalar_stmts = vNULL;
-	  scalar_stmts.create (group_size);
-	  for (unsigned i = 0; i < group_size; ++i)
-	    scalar_stmts.quick_push (next_info);
-	  slp_tree conv = vect_create_new_slp_node (scalar_stmts);
-	  SLP_TREE_CHILDREN (conv).quick_push (node);
-	  node = conv;
-	  /* We also have to fake this conversion stmt as SLP reduction group
-	     so we don't have to mess with too much code elsewhere.  */
-	  REDUC_GROUP_FIRST_ELEMENT (next_info) = next_info;
-	  REDUC_GROUP_NEXT_ELEMENT (next_info) = NULL;
-	}
-
       /* Calculate the unrolling factor based on the smallest type.  */
       poly_uint64 unrolling_factor
 	= calculate_unrolling_factor (max_nunits, group_size);
@@ -2355,6 +2327,36 @@  vect_analyze_slp_instance (vec_info *vinfo,
 		}
 	    }
 
+	  /* If this is a reduction chain with a conversion in front
+	     amend the SLP tree with a node for that.  */
+	  if (!dr
+	      && REDUC_GROUP_FIRST_ELEMENT (stmt_info)
+	      && STMT_VINFO_DEF_TYPE (stmt_info) != vect_reduction_def)
+	    {
+	      /* Get at the conversion stmt - we know it's the single use
+		 of the last stmt of the reduction chain.  */
+	      gimple *tem = vect_orig_stmt (scalar_stmts[group_size - 1])->stmt;
+	      use_operand_p use_p;
+	      gimple *use_stmt;
+	      bool r = single_imm_use (gimple_assign_lhs (tem),
+				       &use_p, &use_stmt);
+	      gcc_assert (r);
+	      next_info = vinfo->lookup_stmt (use_stmt);
+	      next_info = vect_stmt_to_vectorize (next_info);
+	      scalar_stmts = vNULL;
+	      scalar_stmts.create (group_size);
+	      for (unsigned i = 0; i < group_size; ++i)
+		scalar_stmts.quick_push (next_info);
+	      slp_tree conv = vect_create_new_slp_node (scalar_stmts);
+	      SLP_TREE_CHILDREN (conv).quick_push (node);
+	      SLP_INSTANCE_TREE (new_instance) = conv;
+	      /* We also have to fake this conversion stmt as SLP reduction
+		 group so we don't have to mess with too much code
+		 elsewhere.  */
+	      REDUC_GROUP_FIRST_ELEMENT (next_info) = next_info;
+	      REDUC_GROUP_NEXT_ELEMENT (next_info) = NULL;
+	    }
+
 	  vinfo->slp_instances.safe_push (new_instance);
 
 	  if (dump_enabled_p ())