diff options
author | Richard Biener <rguenther@suse.de> | 2015-05-04 13:31:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-05-04 13:31:02 +0000 |
commit | 7457466941a2a06b99731bb7ed3ab90ba37b8110 (patch) | |
tree | b4165f54c0015b1933b734920539b2fae5aa2aaa /gcc/tree-vect-slp.c | |
parent | a6c014db508f18416e5863907db1b628acfe021b (diff) | |
download | gcc-7457466941a2a06b99731bb7ed3ab90ba37b8110.zip gcc-7457466941a2a06b99731bb7ed3ab90ba37b8110.tar.gz gcc-7457466941a2a06b99731bb7ed3ab90ba37b8110.tar.bz2 |
re PR tree-optimization/65935 (433.milc in SPEC CPU 2006 is miscompiled)
2015-05-04 Richard Biener <rguenther@suse.de>
PR tree-optimization/65935
* tree-vect-slp.c (vect_build_slp_tree): If we swapped operands
then make sure to apply that swapping to the IL.
* gcc.dg/vect/bb-slp-pr65935.c: New testcase.
From-SVN: r222764
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r-- | gcc/tree-vect-slp.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 60f257b..2b8f9bd 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -1081,13 +1081,25 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, dump_printf (MSG_NOTE, "%d ", j); } dump_printf (MSG_NOTE, "\n"); - /* And try again ... */ + /* And try again with scratch 'matches' ... */ + bool *tem = XALLOCAVEC (bool, group_size); if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &child, group_size, max_nunits, loads, vectorization_factor, - matches, npermutes, &this_tree_size, + 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. */ + 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; |