re PR tree-optimization/68492 (internal compiler error: in vect_is_simple_use, at...
authorRichard Biener <rguenther@suse.de>
Wed, 25 Nov 2015 08:53:22 +0000 (08:53 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 25 Nov 2015 08:53:22 +0000 (08:53 +0000)
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.

From-SVN: r230855

gcc/ChangeLog
gcc/tree-vect-slp.c

index 362f21f1a9cacd2db8ac61379aad428f172fd8ad..28def7d3e3a391f766ce7d87960dc7631fee2c0a 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2015-11-25  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68502
index 446ef984064216dd4b74ca27ea02856eeb187685..320248cff1c3ae7851b6bbf1bdb72a11b1688f82 100644 (file)
@@ -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