From 7457466941a2a06b99731bb7ed3ab90ba37b8110 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 4 May 2015 13:31:02 +0000 Subject: re PR tree-optimization/65935 (433.milc in SPEC CPU 2006 is miscompiled) 2015-05-04 Richard Biener 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 --- gcc/tree-vect-slp.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'gcc/tree-vect-slp.c') 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; -- cgit v1.1