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