The following fixes PR68775 a miscompile of 465.tonto on ppc64le. The issue is somewhat hard to trigger as it requires operand swapping to trigger in SLP, thus no testcase (in fact the issue went latent on trunk recently).
Bootstrapped and tested on x86_64-unknown-linux-gnu. Richard. 2015-12-14 Richard Biener <rguent...@suse.de> PR tree-optimization/68775 * tree-vect-slp.c (vect_build_slp_tree): Make sure to apply a operand swapping even if replacing the op with scalars. Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c (revision 230855) +++ gcc/tree-vect-slp.c (working copy) @@ -1078,6 +1078,20 @@ vect_build_slp_tree (vec_info *vinfo, 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. This is also necessary even + 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]; + swap_ssa_operands (stmt, gimple_assign_rhs1_ptr (stmt), + gimple_assign_rhs2_ptr (stmt)); + } + /* If we have all children of child built up from scalars then just throw that away and build it up this node from scalars. */ if (!SLP_TREE_CHILDREN (child).is_empty ()) @@ -1107,17 +1121,6 @@ vect_build_slp_tree (vec_info *vinfo, } } - /* ... 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;