aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-12-16 13:45:40 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-12-16 13:45:40 +0000
commitf47cda24579db16228140f8849e9c456093c92ab (patch)
tree84749a9e26e38c9d0c7cf15d1d025bb6bb8738b1
parent36e24655ddb9e88ec3718e3e4e9dddc7dad1016c (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/tree-vect-slp.c24
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