On Tue, Jul 5, 2011 at 1:08 PM, Razya Ladelsky <ra...@il.ibm.com> wrote:
> Zdenek Dvorak <rakd...@kam.mff.cuni.cz> wrote on 05/07/2011 13:37:41:
>
>> From: Zdenek Dvorak <rakd...@kam.mff.cuni.cz>
>> To: Razya Ladelsky/Haifa/IBM@IBMIL
>> Cc: gcc-patches@gcc.gnu.org, Richard Guenther
> <richard.guent...@gmail.com>
>> Date: 05/07/2011 13:37
>> Subject: Re: PATCH] PR 49580
>>
>> Hi,
>>
>> > I moved the adjustment of the loop's iterations from
>> > gimple_duplicate_sese_tail
>> > to tree-parloops.c, right before the call to
> gimple_duplicate_sese_tail.
>> > I repeated the bootstrap, regression and spec runs - no new
> regressions.
>> >
>> > OK to commit?
>>
>> OK,
>>
>> Zdenek
>
> I also want to commit this testcase, which is a reduced case of the gcc
> benchmark.
> I apologize for not submitting it together with the patch.
> OK?

Ok.

Thanks,
Richard.

> Thanks,
> Razya
>
>
>
>
>>
>> > Index: gcc/tree-parloops.c
>> > ===================================================================
>> > --- gcc/tree-parloops.c   (revision 174166)
>> > +++ gcc/tree-parloops.c   (working copy)
>> > @@ -1464,6 +1464,8 @@ transform_to_exit_first_loop (struct loop *loop,
> h
>> >    gimple phi, nphi, cond_stmt, stmt, cond_nit;
>> >    gimple_stmt_iterator gsi;
>> >    tree nit_1;
>> > +  edge exit_1;
>> > +  tree new_rhs;
>> >
>> >    split_block_after_labels (loop->header);
>> >    orig_header = single_succ (loop->header);
>> > @@ -1492,6 +1494,38 @@ transform_to_exit_first_loop (struct loop
> *loop, h
>> >       control = t;
>> >     }
>> >      }
>> > +
>> > + /* Setting the condition towards peeling the last iteration:
>> > +    If the block consisting of the exit condition has the latch as
>> > +    successor, then the body of the loop is executed before
>> > +    the exit condition is tested.  In such case, moving the
>> > +    condition to the entry, causes that the loop will iterate
>> > +    one less iteration (which is the wanted outcome, since we
>> > +    peel out the last iteration).  If the body is executed after
>> > +    the condition, moving the condition to the entry requires
>> > +    decrementing one iteration.  */
>> > +  exit_1 = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
>> > +  if (exit_1->dest == loop->latch)
>> > +    new_rhs = gimple_cond_rhs (cond_stmt);
>> > +  else
>> > +  {
>> > +    new_rhs = fold_build2 (MINUS_EXPR, TREE_TYPE (gimple_cond_rhs
>> (cond_stmt)),
>> > +            gimple_cond_rhs (cond_stmt),
>> > +            build_int_cst (TREE_TYPE (gimple_cond_rhs (cond_stmt)),
> 1));
>> > +    if (TREE_CODE (gimple_cond_rhs (cond_stmt)) == SSA_NAME)
>> > +      {
>> > +    basic_block preheader;
>> > +     gimple_stmt_iterator gsi1;
>> > +
>> > +     preheader = loop_preheader_edge(loop)->src;
>> > +       gsi1 = gsi_after_labels (preheader);
>> > +   new_rhs = force_gimple_operand_gsi (&gsi1, new_rhs, true,
>> > +                   NULL_TREE,false,GSI_CONTINUE_LINKING);
>> > +      }
>> > +  }
>> > +  gimple_cond_set_rhs (cond_stmt, unshare_expr (new_rhs));
>> > +  gimple_cond_set_lhs (cond_stmt, unshare_expr (gimple_cond_lhs
>> (cond_stmt)));
>> > +
>> >    bbs = get_loop_body_in_dom_order (loop);
>> >
>> >    for (n = 0; bbs[n] != loop->latch; n++)
>> > Index: gcc/tree-cfg.c
>> > ===================================================================
>> > --- gcc/tree-cfg.c   (revision 174166)
>> > +++ gcc/tree-cfg.c   (working copy)
>> > @@ -5397,12 +5397,10 @@ gimple_duplicate_sese_tail (edge entry
> ATTRIBUTE_U
>> >    int total_freq = 0, exit_freq = 0;
>> >    gcov_type total_count = 0, exit_count = 0;
>> >    edge exits[2], nexits[2], e;
>> > -  gimple_stmt_iterator gsi,gsi1;
>> > +  gimple_stmt_iterator gsi;
>> >    gimple cond_stmt;
>> >    edge sorig, snew;
>> >    basic_block exit_bb;
>> > -  basic_block iters_bb;
>> > -  tree new_rhs;
>> >    gimple_stmt_iterator psi;
>> >    gimple phi;
>> >    tree def;
>> > @@ -5483,35 +5481,6 @@ gimple_duplicate_sese_tail (edge entry
> ATTRIBUTE_U
>> >    gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
>> >    cond_stmt = gimple_copy (cond_stmt);
>> >
>> > - /* If the block consisting of the exit condition has the latch as
>> > -    successor, then the body of the loop is executed before
>> > -    the exit condition is tested.  In such case, moving the
>> > -    condition to the entry, causes that the loop will iterate
>> > -    one less iteration (which is the wanted outcome, since we
>> > -    peel out the last iteration).  If the body is executed after
>> > -    the condition, moving the condition to the entry requires
>> > -    decrementing one iteration.  */
>> > -  if (exits[1]->dest == orig_loop->latch)
>> > -    new_rhs = gimple_cond_rhs (cond_stmt);
>> > -  else
>> > -  {
>> > -    new_rhs = fold_build2 (MINUS_EXPR, TREE_TYPE (gimple_cond_rhs
>> (cond_stmt)),
>> > -            gimple_cond_rhs (cond_stmt),
>> > -            build_int_cst (TREE_TYPE (gimple_cond_rhs (cond_stmt)),
> 1));
>> > -
>> > -    if (TREE_CODE (gimple_cond_rhs (cond_stmt)) == SSA_NAME)
>> > -      {
>> > -   iters_bb = gimple_bb (SSA_NAME_DEF_STMT (gimple_cond_rhs
> (cond_stmt)));
>> > -   for (gsi1 = gsi_start_bb (iters_bb); !gsi_end_p (gsi1);
>> gsi_next (&gsi1))
>> > -     if (gsi_stmt (gsi1) == SSA_NAME_DEF_STMT (gimple_cond_rhs
>> (cond_stmt)))
>> > -       break;
>> > -
>> > -   new_rhs = force_gimple_operand_gsi (&gsi1, new_rhs, true,
>> > -                   NULL_TREE,false,GSI_CONTINUE_LINKING);
>> > -      }
>> > -  }
>> > -  gimple_cond_set_rhs (cond_stmt, unshare_expr (new_rhs));
>> > -  gimple_cond_set_lhs (cond_stmt, unshare_expr (gimple_cond_lhs
>> (cond_stmt)));
>> >    gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
>> >
>> >    sorig = single_succ_edge (switch_bb);
>>
>> >
>> > 07-05-2011  Razya Ladelsky  <ra...@il.ibm.com>
>> >
>> >    * tree-cfg.c (gimple_duplicate_sese_tail): Remove handling of
>> >    the loop's number of iterations.
>> >         * tree-parloops.c (transform_to_exit_first_loop): Add the
>> >    handling of the loop's number of iterations before the call
>> >    to gimple_duplicate_sese_tail.
>> >         Insert the stmt caclculating the new rhs of the loop's
>> >    condition stmt to the preheader instead of iters_bb.
>>
>

Reply via email to