When making COND_EXPR/VEC_COND_EXPR a gimple ternary op I forgot
to update ternary handling in gimple_fold_stmt_to_constant_1 to also
valueize and fold the embedded comparison.  Done so.  This also
adjusts SCCVN to accept a SSA name result from that folder, when
simplifying A > 1 ? 2 : C to C, which is certainly useful
(observed with a testcase which triggers vector lowering).

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2011-10-05  Richard Guenther  <rguent...@suse.de>

        * gimple-fold.c (gimple_fold_stmt_to_constant_1): For
        ternary ops with an embedded expression valueize and fold
        that as well.
        * tree-ssa-sccvn.c (try_to_simplify): Also allow SSA name
        results from gimple_fold_stmt_to_constant_1.

Index: gcc/gimple-fold.c
===================================================================
*** gcc/gimple-fold.c   (revision 179540)
--- gcc/gimple-fold.c   (working copy)
*************** gimple_fold_stmt_to_constant_1 (gimple s
*** 2569,2574 ****
--- 2569,2587 ----
                tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
                tree op2 = (*valueize) (gimple_assign_rhs3 (stmt));
  
+             /* Fold embedded expressions in ternary codes.  */
+             if ((subcode == COND_EXPR
+                  || subcode == VEC_COND_EXPR)
+                 && COMPARISON_CLASS_P (op0))
+               {
+                 tree op00 = (*valueize) (TREE_OPERAND (op0, 0));
+                 tree op01 = (*valueize) (TREE_OPERAND (op0, 1));
+                 tree tem = fold_binary_loc (loc, TREE_CODE (op0),
+                                             TREE_TYPE (op0), op00, op01);
+                 if (tem)
+                   op0 = tem;
+               }
+ 
                return fold_ternary_loc (loc, subcode,
                                       gimple_expr_type (stmt), op0, op1, op2);
              }
Index: gcc/tree-ssa-sccvn.c
===================================================================
*** gcc/tree-ssa-sccvn.c        (revision 179539)
--- gcc/tree-ssa-sccvn.c        (working copy)
*************** simplify_unary_expression (gimple stmt)
*** 2967,2993 ****
  static tree
  try_to_simplify (gimple stmt)
  {
    tree tem;
  
    /* For stores we can end up simplifying a SSA_NAME rhs.  Just return
       in this case, there is no point in doing extra work.  */
!   if (gimple_assign_copy_p (stmt)
!       && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
      return NULL_TREE;
  
    /* First try constant folding based on our current lattice.  */
!   tem = gimple_fold_stmt_to_constant (stmt, vn_valueize);
!   if (tem)
      return tem;
  
    /* If that didn't work try combining multiple statements.  */
!   switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
      {
      case tcc_reference:
!       /* Fallthrough for some codes that can operate on registers.  */
!       if (!(TREE_CODE (gimple_assign_rhs1 (stmt)) == REALPART_EXPR
!           || TREE_CODE (gimple_assign_rhs1 (stmt)) == IMAGPART_EXPR
!           || TREE_CODE (gimple_assign_rhs1 (stmt)) == VIEW_CONVERT_EXPR))
        break;
        /* We could do a little more with unary ops, if they expand
         into binary ops, but it's debatable whether it is worth it. */
--- 2967,2995 ----
  static tree
  try_to_simplify (gimple stmt)
  {
+   enum tree_code code = gimple_assign_rhs_code (stmt);
    tree tem;
  
    /* For stores we can end up simplifying a SSA_NAME rhs.  Just return
       in this case, there is no point in doing extra work.  */
!   if (code == SSA_NAME)
      return NULL_TREE;
  
    /* First try constant folding based on our current lattice.  */
!   tem = gimple_fold_stmt_to_constant_1 (stmt, vn_valueize);
!   if (tem
!       && (TREE_CODE (tem) == SSA_NAME
!         || is_gimple_min_invariant (tem)))
      return tem;
  
    /* If that didn't work try combining multiple statements.  */
!   switch (TREE_CODE_CLASS (code))
      {
      case tcc_reference:
!       /* Fallthrough for some unary codes that can operate on registers.  */
!       if (!(code == REALPART_EXPR
!           || code == IMAGPART_EXPR
!           || code == VIEW_CONVERT_EXPR))
        break;
        /* We could do a little more with unary ops, if they expand
         into binary ops, but it's debatable whether it is worth it. */

Reply via email to