$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 ----

Reply via email to