On Mon, Jan 2, 2012 at 9:37 PM, Richard Guenther
<[email protected]> wrote:
> Well, with
>
> Index: gcc/tree-ssa-pre.c
> ===================================================================
> --- gcc/tree-ssa-pre.c (revision 182784)
> +++ gcc/tree-ssa-pre.c (working copy)
> @@ -4335,16 +4335,23 @@ eliminate (void)
> available value-numbers. */
> else if (gimple_code (stmt) == GIMPLE_COND)
> {
> - tree op0 = gimple_cond_lhs (stmt);
> - tree op1 = gimple_cond_rhs (stmt);
> + tree op[2];
> tree result;
> + vn_nary_op_t nary;
>
> - if (TREE_CODE (op0) == SSA_NAME)
> - op0 = VN_INFO (op0)->valnum;
> - if (TREE_CODE (op1) == SSA_NAME)
> - op1 = VN_INFO (op1)->valnum;
> + op[0] = gimple_cond_lhs (stmt);
> + op[1] = gimple_cond_rhs (stmt);
> + if (TREE_CODE (op[0]) == SSA_NAME)
> + op[0] = VN_INFO (op[0])->valnum;
> + if (TREE_CODE (op[1]) == SSA_NAME)
> + op[1] = VN_INFO (op[1])->valnum;
> result = fold_binary (gimple_cond_code (stmt), boolean_type_node,
> - op0, op1);
> + op[0], op[1]);
> + if (!result)
> + result = vn_nary_op_lookup_pieces (2, gimple_cond_code (stmt),
> + boolean_type_node,
> + op, &nary);
> +
> if (result && TREE_CODE (result) == INTEGER_CST)
> {
> if (integer_zerop (result))
> @@ -4354,6 +4361,13 @@ eliminate (void)
> update_stmt (stmt);
> todo = TODO_cleanup_cfg;
> }
> + else if (result && TREE_CODE (result) == SSA_NAME)
> + {
> + gimple_cond_set_code (stmt, NE_EXPR);
> + gimple_cond_set_lhs (stmt, result);
> + gimple_cond_set_rhs (stmt, boolean_false_node);
> + update_stmt (stmt);
> + }
> }
> /* Visit indirect calls and turn them into direct calls if
> possible. */
>
> you get the CSE (too simple patch, you need to check leaders properly).
> You can then add similar lookups for an inverted conditional.
Thanks for your explanation. On shortcoming of this method is that it
cannot find/take cond_expr(and the implicitly defined variable) as the
leader in pre. I guess this is why you said it can handle a subset of all
cases in previous message?
on the other hand, I like this method, given the simplicity especially. :)
--
Best Regards.