$subject says it all, COND_EXPR to follow. rhs1 will still be a "single" tree, namely a is_gimple_condexpr () operand. That's not easy to change (without forcing it to a separate statement, thus making it a is_gimple_val) because it embeds another tree code.
Bootstrapped and tested on x86_64-unknown-linux-gnu. Any serious objections? Thanks, Richard. 2011-08-31 Richard Guenther <rguent...@suse.de> * expr.c (expand_expr_real_2): Move VEC_COND_EXPR handling here, from ... (expand_expr_real_1): ... here. * gimple-pretty-print.c (dump_ternary_rhs): Handle VEC_COND_EXPR. * gimple.c (gimple_rhs_class_table): Make VEC_COND_EXPR a GIMPLE_TERNARY_RHS. * tree-cfg.c (verify_gimple_assign_ternary): Handle VEC_COND_EXPR here ... (verify_gimple_assign_single): ... not here. Index: trunk/gcc/expr.c =================================================================== *** trunk.orig/gcc/expr.c 2011-08-29 16:57:31.000000000 +0200 --- trunk/gcc/expr.c 2011-08-31 13:45:09.000000000 +0200 *************** expand_expr_real_2 (sepops ops, rtx targ *** 8636,8641 **** --- 8636,8645 ---- return temp; } + case VEC_COND_EXPR: + target = expand_vec_cond_expr (type, treeop0, treeop1, treeop2, target); + return target; + default: gcc_unreachable (); } *************** expand_expr_real_1 (tree exp, rtx target *** 9932,9941 **** OK_DEFER_POP; return temp; - case VEC_COND_EXPR: - target = expand_vec_cond_expr (type, treeop0, treeop1, treeop2, target); - return target; - case MODIFY_EXPR: { tree lhs = treeop0; --- 9936,9941 ---- Index: trunk/gcc/gimple-pretty-print.c =================================================================== *** trunk.orig/gcc/gimple-pretty-print.c 2011-07-11 17:02:51.000000000 +0200 --- trunk/gcc/gimple-pretty-print.c 2011-08-31 13:38:42.000000000 +0200 *************** dump_ternary_rhs (pretty_printer *buffer *** 428,433 **** --- 428,443 ---- pp_string (buffer, ">"); break; + case VEC_COND_EXPR: + pp_string (buffer, "VEC_COND_EXPR <"); + dump_generic_node (buffer, gimple_assign_rhs1 (gs), spc, flags, false); + pp_string (buffer, ", "); + dump_generic_node (buffer, gimple_assign_rhs2 (gs), spc, flags, false); + pp_string (buffer, ", "); + dump_generic_node (buffer, gimple_assign_rhs3 (gs), spc, flags, false); + pp_string (buffer, ">"); + break; + default: gcc_unreachable (); } Index: trunk/gcc/gimple.c =================================================================== *** trunk.orig/gcc/gimple.c 2011-08-16 15:01:54.000000000 +0200 --- trunk/gcc/gimple.c 2011-08-31 13:27:41.000000000 +0200 *************** get_gimple_rhs_num_ops (enum tree_code c *** 2615,2620 **** --- 2615,2621 ---- || (SYM) == WIDEN_MULT_MINUS_EXPR \ || (SYM) == DOT_PROD_EXPR \ || (SYM) == REALIGN_LOAD_EXPR \ + || (SYM) == VEC_COND_EXPR \ || (SYM) == FMA_EXPR) ? GIMPLE_TERNARY_RHS \ : ((SYM) == COND_EXPR \ || (SYM) == CONSTRUCTOR \ *************** get_gimple_rhs_num_ops (enum tree_code c *** 2622,2629 **** || (SYM) == ASSERT_EXPR \ || (SYM) == ADDR_EXPR \ || (SYM) == WITH_SIZE_EXPR \ ! || (SYM) == SSA_NAME \ ! || (SYM) == VEC_COND_EXPR) ? GIMPLE_SINGLE_RHS \ : GIMPLE_INVALID_RHS), #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS, --- 2623,2629 ---- || (SYM) == ASSERT_EXPR \ || (SYM) == ADDR_EXPR \ || (SYM) == WITH_SIZE_EXPR \ ! || (SYM) == SSA_NAME) ? GIMPLE_SINGLE_RHS \ : GIMPLE_INVALID_RHS), #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS, Index: trunk/gcc/tree-cfg.c =================================================================== *** trunk.orig/gcc/tree-cfg.c 2011-08-29 13:56:18.000000000 +0200 --- trunk/gcc/tree-cfg.c 2011-08-31 13:42:01.000000000 +0200 *************** verify_gimple_assign_ternary (gimple stm *** 3761,3767 **** return true; } ! if (!is_gimple_val (rhs1) || !is_gimple_val (rhs2) || !is_gimple_val (rhs3)) { --- 3761,3768 ---- return true; } ! if ((rhs_code == VEC_COND_EXPR ! ? !is_gimple_condexpr (rhs1) : !is_gimple_val (rhs1)) || !is_gimple_val (rhs2) || !is_gimple_val (rhs3)) { *************** verify_gimple_assign_ternary (gimple stm *** 3806,3811 **** --- 3807,3813 ---- case DOT_PROD_EXPR: case REALIGN_LOAD_EXPR: + case VEC_COND_EXPR: /* FIXME. */ return false; *************** verify_gimple_assign_single (gimple stmt *** 3939,3945 **** case OBJ_TYPE_REF: case ASSERT_EXPR: case WITH_SIZE_EXPR: - case VEC_COND_EXPR: /* FIXME. */ return res; --- 3941,3946 ----