This is the mail archive of the gcc-patches@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: [PATCH 2/4] Call maybe_fold_or_comparisons to fold OR-ed predicates.


On Thu, 8 Jul 2010, Sebastian Pop wrote:

> On Thu, Jul 8, 2010 at 04:57, Richard Guenther <rguenther@suse.de> wrote:
> > On Wed, 7 Jul 2010, Sebastian Pop wrote:
> >
> >> ? ? ? PR tree-optimization/44710
> >> ? ? ? * tree-if-conv.c (parse_predicate): New.
> >> ? ? ? (add_to_predicate_list): Call it, call maybe_fold_or_comparisons.
> >> ? ? ? Make sure that the predicates are either SSA_NAMEs or gimple_condexpr.
> >>
> >> ? ? ? * gcc.dg/tree-ssa/ifc-6.c: New.
> >> ---
> >> ?gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c | ? 15 +++++
> >> ?gcc/tree-if-conv.c ? ? ? ? ? ? ? ? ? ?| ? 92 ++++++++++++++++++++++++++++++---
> >> ?2 files changed, 100 insertions(+), 7 deletions(-)
> >> ?create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c
> >>
> >> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c
> >> new file mode 100644
> >> index 0000000..a9c5db3
> >> --- /dev/null
> >> +++ b/gcc/testsuite/gcc.dg/tree-ssa/ifc-6.c
> >> @@ -0,0 +1,15 @@
> >> +/* { dg-do compile } */
> >> +/* { dg-options "-c -O2 -ftree-vectorize" { target *-*-* } } */
> >> +
> >> +static int x;
> >> +foo (int n, int *A)
> >> +{
> >> + ?int i;
> >> + ?for (i = 0; i < n; i++)
> >> + ? ?{
> >> + ? ? ?if (A[i])
> >> + ? ? x = 2;
> >> + ? ? ?if (A[i + 1])
> >> + ? ? x = 1;
> >> + ? ?}
> >> +}
> >> diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
> >> index ad106d7..03e453e 100644
> >> --- a/gcc/tree-if-conv.c
> >> +++ b/gcc/tree-if-conv.c
> >> @@ -259,17 +259,95 @@ is_predicated (basic_block bb)
> >> ? ?return !is_true_predicate (bb_predicate (bb));
> >> ?}
> >>
> >> -/* Add condition NEW_COND to the predicate list of basic block BB. ?*/
> >> +/* Parses the predicate COND and returns its comparison code and
> >> + ? operands OP0 and OP1. ?*/
> >> +
> >> +static enum tree_code
> >> +parse_predicate (tree cond, tree *op0, tree *op1)
> >> +{
> >> + ?gimple s;
> >> +
> >> + ?if (TREE_CODE (cond) == SSA_NAME
> >> + ? ? ?&& is_gimple_assign (s = SSA_NAME_DEF_STMT (cond)))
> >> + ? ?{
> >> + ? ? ?if (TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison)
> >> + ? ? {
> >> + ? ? ? *op0 = gimple_assign_rhs1 (s);
> >> + ? ? ? *op1 = gimple_assign_rhs2 (s);
> >> + ? ? ? return gimple_assign_rhs_code (s);
> >> + ? ? }
> >> +
> >> + ? ? ?else if (gimple_assign_rhs_code (s) == TRUTH_NOT_EXPR)
> >> + ? ? {
> >> + ? ? ? tree op = gimple_assign_rhs1 (s);
> >> + ? ? ? tree type = TREE_TYPE (op);
> >> + ? ? ? enum tree_code code = parse_predicate (op, op0, op1);
> >> +
> >> + ? ? ? return code == ERROR_MARK ? ERROR_MARK :
> >> + ? ? ? ? invert_tree_comparison (code, HONOR_NANS (TYPE_MODE (type)));
> >
> > The : goes on the next line.
> >
> >> + ? ? }
> >> +
> >> + ? ? ?return ERROR_MARK;
> >> + ? ?}
> >> +
> >> + ?if (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison)
> >> + ? ?{
> >> + ? ? ?*op0 = TREE_OPERAND (cond, 0);
> >> + ? ? ?*op1 = TREE_OPERAND (cond, 1);
> >> + ? ? ?return TREE_CODE (cond);
> >> + ? ?}
> >> +
> >> + ?return ERROR_MARK;
> >> +}
> >> +
> >> +/* Add condition NC to the predicate list of basic block BB. ?*/
> >>
> >> ?static inline void
> >> -add_to_predicate_list (basic_block bb, tree new_cond)
> >> +add_to_predicate_list (basic_block bb, tree nc)
> >> ?{
> >> - ?tree cond = bb_predicate (bb);
> >> + ?tree bc;
> >>
> >> - ?set_bb_predicate (bb, is_true_predicate (cond) ? new_cond :
> >> - ? ? ? ? ? ? ? ? fold_build2_loc (EXPR_LOCATION (cond),
> >> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TRUTH_OR_EXPR, boolean_type_node,
> >> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cond, new_cond));
> >> + ?if (is_true_predicate (nc))
> >> + ? ?return;
> >> +
> >> + ?if (!is_predicated (bb))
> >> + ? ?bc = nc;
> >> + ?else
> >> + ? ?{
> >> + ? ? ?enum tree_code code1, code2;
> >> + ? ? ?tree op1a, op1b, op2a, op2b;
> >> +
> >> + ? ? ?bc = bb_predicate (bb);
> >> + ? ? ?code1 = parse_predicate (bc, &op1a, &op1b);
> >> + ? ? ?code2 = parse_predicate (nc, &op2a, &op2b);
> >> +
> >> + ? ? ?if (code1 != ERROR_MARK && code2 != ERROR_MARK)
> >> + ? ? {
> >> + ? ? ? bc = maybe_fold_or_comparisons (code1, op1a, op1b, code2, op2a, op2b);
> >> +
> >> + ? ? ? if (!bc)
> >> + ? ? ? ? {
> >> + ? ? ? ? ? bc = bb_predicate (bb);
> >> + ? ? ? ? ? bc = fold_build2_loc (EXPR_LOCATION (bc), TRUTH_OR_EXPR,
> >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? boolean_type_node, bc, nc);
> >> + ? ? ? ? }
> >> + ? ? }
> >> + ? ? ?else
> >> + ? ? bc = fold_build2_loc (EXPR_LOCATION (bc), TRUTH_OR_EXPR,
> >> + ? ? ? ? ? ? ? ? ? ? ? ? ? boolean_type_node, bc, nc);
> >
> > your re-use of bc makes this overly complicated. ?Please use a new
> > tem for the maybe_fold_or_comparisons result and commonize the
> > !temp fold_build2_loc paths (and avoid re-loading bb_predicate)
> >
> >> + ? ?}
> >> +
> >> + ?if (!is_gimple_condexpr (bc))
> >> + ? ?{
> >> + ? ? ?gimple_seq stmts;
> >> + ? ? ?bc = force_gimple_operand (bc, &stmts, true, NULL_TREE);
> >> + ? ? ?add_bb_predicate_gimplified_stmts (bb, stmts);
> >> + ? ?}
> >> +
> >> + ?if (is_true_predicate (bc))
> >> + ? ?reset_bb_predicate (bb);
> >> + ?else
> >> + ? ?set_bb_predicate (bb, bc);
> >> ?}
> >>
> >> ?/* Add the condition COND to the previous condition PREV_COND, and add
> >>
> >
> > Ok with that change.
> >
> 
> Committed r161964.

Why did you commit without the requested change?

Richard.

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