This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFC: Handle conditional expression in sccvn/fre/pre


On Mon, Jan 2, 2012 at 9:37 PM, Richard Guenther
<richard.guenther@gmail.com> 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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]