diff options
author | Richard Biener <rguenther@suse.de> | 2015-12-16 13:45:40 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-12-16 13:45:40 +0000 |
commit | f47cda24579db16228140f8849e9c456093c92ab (patch) | |
tree | 84749a9e26e38c9d0c7cf15d1d025bb6bb8738b1 | |
parent | 36e24655ddb9e88ec3718e3e4e9dddc7dad1016c (diff) | |
download | gcc-f47cda24579db16228140f8849e9c456093c92ab.zip gcc-f47cda24579db16228140f8849e9c456093c92ab.tar.gz gcc-f47cda24579db16228140f8849e9c456093c92ab.tar.bz2 |
re PR tree-optimization/68861 (FAIL: libgomp.fortran/vla8.f90 -O3 -g execution test)
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.
From-SVN: r231689
-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 |