diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 24 |
2 files changed, 27 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78dc4e3..c74d25a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-12-16 Richard Biener <rguenther@suse.de> + + PR tree-optimization/68861 + * tree-vect-slp.c (vect_build_slp_tree): Properly handle + duplicate stmts when applying swapping to stmts. + 2015-12-16 Kirill Yukhin <kirill.yukhin@intel.com> * config/i386/i386-c.c (ix86_target_macros_internal): Remove diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index f57c859..6955e15 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -1049,11 +1049,29 @@ vect_build_slp_tree (vec_info *vinfo, 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]; + gimple_set_plf (stmt, GF_PLF_1, false); + } + for (j = 0; j < group_size; ++j) + { + gimple *stmt = SLP_TREE_SCALAR_STMTS (*node)[j]; + if (!matches[j]) + { + /* Avoid swapping operands twice. */ + if (gimple_plf (stmt, GF_PLF_1)) + continue; + swap_ssa_operands (stmt, gimple_assign_rhs1_ptr (stmt), + gimple_assign_rhs2_ptr (stmt)); + gimple_set_plf (stmt, GF_PLF_1, true); + } + } + /* Verify we swap all duplicates or none. */ + if (flag_checking) + for (j = 0; j < group_size; ++j) { gimple *stmt = SLP_TREE_SCALAR_STMTS (*node)[j]; - swap_ssa_operands (stmt, gimple_assign_rhs1_ptr (stmt), - gimple_assign_rhs2_ptr (stmt)); + gcc_assert (gimple_plf (stmt, GF_PLF_1) == ! matches[j]); } /* If we have all children of child built up from scalars then |