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. */