I forgot to roll back SLP child state when ending up building vectors
from scalars.

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

Richard.

2015-05-19  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/66185
        * tree-vect-slp.c (vect_build_slp_tree): Properly roll back
        when building the SLP node from scalars.

        * gcc.dg/torture/pr66185.c: New testcase.

Index: gcc/tree-vect-slp.c
===================================================================
*** gcc/tree-vect-slp.c (revision 223288)
--- gcc/tree-vect-slp.c (working copy)
*************** vect_build_slp_tree (loop_vec_info loop_
*** 1103,1108 ****
--- 1103,1118 ----
             scalar version.  */
          && !is_pattern_stmt_p (vinfo_for_stmt (stmt)))
        {
+         unsigned int j;
+         slp_tree 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 vector operands from scalars\n");
          oprnd_info->def_stmts = vNULL;
Index: gcc/testsuite/gcc.dg/torture/pr66185.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr66185.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr66185.c      (working copy)
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ 
+ unsigned int a;
+ int b[5], c;
+ 
+ int
+ main ()
+ {
+   for (c = 0; c < 4; c++)
+     b[c] = b[c+1] > ((b[0] > 0) > a);
+ 
+   return 0;
+ }

Reply via email to