Hi! I've noticed we create a VEC_COND_EXPR tree just to grab the arguments from it to construct a ternary gimple assign.
The following patch fixes that by creating the ternary gimple assign directly. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-01-22 Jakub Jelinek <ja...@redhat.com> * tree-vect-stmts.c (vectorizable_condition): Build a VEC_COND_EXPR directly instead of building a temporary tree. --- gcc/tree-vect-stmts.c.jj 2016-01-20 15:39:08.000000000 +0100 +++ gcc/tree-vect-stmts.c 2016-01-22 10:25:59.744444625 +0100 @@ -7478,7 +7478,7 @@ vectorizable_condition (gimple *stmt, gi tree comp_vectype = NULL_TREE; tree vec_cond_lhs = NULL_TREE, vec_cond_rhs = NULL_TREE; tree vec_then_clause = NULL_TREE, vec_else_clause = NULL_TREE; - tree vec_compare, vec_cond_expr; + tree vec_compare; tree new_temp; loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); enum vect_def_type dt, dts[4]; @@ -7691,12 +7691,10 @@ vectorizable_condition (gimple *stmt, gi vec_compare = build2 (TREE_CODE (cond_expr), vec_cmp_type, vec_cond_lhs, vec_cond_rhs); } - vec_cond_expr = build3 (VEC_COND_EXPR, vectype, - vec_compare, vec_then_clause, vec_else_clause); - - new_stmt = gimple_build_assign (vec_dest, vec_cond_expr); - new_temp = make_ssa_name (vec_dest, new_stmt); - gimple_assign_set_lhs (new_stmt, new_temp); + new_temp = make_ssa_name (vec_dest); + new_stmt = gimple_build_assign (new_temp, VEC_COND_EXPR, + vec_compare, vec_then_clause, + vec_else_clause); vect_finish_stmt_generation (stmt, new_stmt, gsi); if (slp_node) SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt); Jakub