2015-12-14 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Dec 2015 13:42:03 +0000 (13:42 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Dec 2015 13:42:03 +0000 (13:42 +0000)
PR tree-optimization/68775
* tree-vect-slp.c (vect_build_slp_tree): Make sure to apply
a operand swapping even if replacing the op with scalars.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231617 138bc75d-0d04-0410-961f-82ee72b054a4

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

index c79b65c..abffbd7 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-14  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/68775
+       * tree-vect-slp.c (vect_build_slp_tree): Make sure to apply
+       a operand swapping even if replacing the op with scalars.
+
 2015-12-14  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * combine.c (change_zero_ext): Do not create a shift of zero length.
index 5be2f90..d355919 100644 (file)
@@ -1044,6 +1044,20 @@ vect_build_slp_tree (vec_info *vinfo,
                                   tem, npermutes, &this_tree_size,
                                   max_tree_size))
            {
+             /* ... 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
+                canonical operand order.  This is also necessary even
+                if we end up building the operand from scalars as
+                we'll continue to process swapped operand two.  */
+             for (j = 0; j < group_size; ++j)
+               if (!matches[j])
+                 {
+                   gimple *stmt = SLP_TREE_SCALAR_STMTS (*node)[j];
+                   swap_ssa_operands (stmt, gimple_assign_rhs1_ptr (stmt),
+                                      gimple_assign_rhs2_ptr (stmt));
+                 }
+
              /* 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 ())
@@ -1073,17 +1087,6 @@ vect_build_slp_tree (vec_info *vinfo,
                    }
                }
 
-             /* ... 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
-                canonical operand order.  */
-             for (j = 0; j < group_size; ++j)
-               if (!matches[j])
-                 {
-                   gimple *stmt = SLP_TREE_SCALAR_STMTS (*node)[j];
-                   swap_ssa_operands (stmt, gimple_assign_rhs1_ptr (stmt),
-                                      gimple_assign_rhs2_ptr (stmt));
-                 }
              oprnd_info->def_stmts = vNULL;
              SLP_TREE_CHILDREN (*node).quick_push (child);
              continue;