SPARC doesn't have vector support in this testcase and no integer multiplication. The general scalarization support fails to fold generated stmts so the following just does what other parts of the lowering do - factor in constants/constructors.
On another note I noticed a tree sharing issue (mitigated by gimplification). Bootstrap & regtest running on x86_64-unknown-linux-gnu. Richard. 2015-11-11 Richard Biener <rguent...@suse.de> PR tree-optimization/58497 * tree-vect-generic.c: Include gimplify.h. (tree_vec_extract): Lookup constant/constructor DEFs. (do_cond): Unshare cond. Index: gcc/tree-vect-generic.c =================================================================== --- gcc/tree-vect-generic.c (revision 230146) +++ gcc/tree-vect-generic.c (working copy) @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. #include "tree-eh.h" #include "gimple-iterator.h" #include "gimplify-me.h" +#include "gimplify.h" #include "tree-cfg.h" @@ -105,6 +106,15 @@ static inline tree tree_vec_extract (gimple_stmt_iterator *gsi, tree type, tree t, tree bitsize, tree bitpos) { + if (TREE_CODE (t) == SSA_NAME) + { + gimple *def_stmt = SSA_NAME_DEF_STMT (t); + if (is_gimple_assign (def_stmt) + && (gimple_assign_rhs_code (def_stmt) == VECTOR_CST + || (bitpos + && gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR))) + t = gimple_assign_rhs1 (def_stmt); + } if (bitpos) { if (TREE_CODE (type) == BOOLEAN_TYPE) @@ -1419,7 +1429,7 @@ do_cond (gimple_stmt_iterator *gsi, tree if (TREE_CODE (TREE_TYPE (b)) == VECTOR_TYPE) b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos); tree cond = gimple_assign_rhs1 (gsi_stmt (*gsi)); - return gimplify_build3 (gsi, code, inner_type, cond, a, b); + return gimplify_build3 (gsi, code, inner_type, unshare_expr (cond), a, b); } /* Expand a vector COND_EXPR to scalars, piecewise. */