diff mbox

Fix PR68492

Message ID alpine.LSU.2.11.1511250945220.4884@t29.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Nov. 25, 2015, 8:48 a.m. UTC
The following should fix PR68492.

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

Richard.

2015-11-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/68492
	* tree-vect-slp.c (vect_build_slp_tree): Consistently build up
	op from scalars after operand swapping.
diff mbox

Patch

Index: gcc/tree-vect-slp.c
===================================================================
--- gcc/tree-vect-slp.c	(revision 230793)
+++ gcc/tree-vect-slp.c	(working copy)
@@ -1078,6 +1078,35 @@  vect_build_slp_tree (vec_info *vinfo,
 				   tem, npermutes, &this_tree_size,
 				   max_tree_size))
 	    {
+	      /* If we have all children of child built up from scalars then
+		 just throw that away and build it up this node from scalars.  */
+	      if (!SLP_TREE_CHILDREN (child).is_empty ())
+		{
+		  unsigned int j;
+		  slp_tree grandchild;
+
+		  FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild)
+		    if (grandchild != NULL)
+		      break;
+		  if (!grandchild)
+		    {
+		      /* Roll back.  */
+		      *max_nunits = old_max_nunits;
+		      loads->truncate (old_nloads);
+		      FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild)
+			vect_free_slp_tree (grandchild);
+		      SLP_TREE_CHILDREN (child).truncate (0);
+
+		      dump_printf_loc (MSG_NOTE, vect_location,
+				       "Building parent vector operands from "
+				       "scalars instead\n");
+		      oprnd_info->def_stmts = vNULL;
+		      vect_free_slp_tree (child);
+		      SLP_TREE_CHILDREN (*node).quick_push (NULL);
+		      continue;
+		    }
+		}
+
 	      /* ... so if successful we can apply the operand swapping
 		 to the GIMPLE IL.  This is necessary because for example
 		 vect_get_slp_defs uses operand indexes and thus expects