Hi Tom! On Mon, 8 Jun 2015 12:43:01 +0200, Tom de Vries <tom_devr...@mentor.com> wrote: > There are two problems in try_transform_to_exit_first_loop_alt: > 1. In case the latch is not a singleton bb, the function should return > false rather than true. > 2. The check for singleton bb should ignore debug-insns. > > Attached patch fixes these problems.
> Fix try_transform_to_exit_first_loop_alt > PR tree-optimization/66442 > * gimple-iterator.h (gimple_seq_nondebug_singleton_p): Add function. > * tree-parloops.c (try_transform_to_exit_first_loop_alt): Return false > if the loop latch is not a singleton. Use > gimple_seq_nondebug_singleton_p instead of gimple_seq_singleton_p. Per my testing, the backport of this patch that you committed to gomp-4_0-branch, r224219, introduces a number of regressions in your OpenACC kernels test cases, specifically the »scan-tree-dump-times parloops_oacc_kernels "(?n)pragma omp target oacc_parallel.*num_gangs\\(32\\)" 1« tests. Would you please have a look? Grüße, Thomas > gcc/gimple-iterator.h | 29 +++++++++++++++++++++++++++++ > gcc/tree-parloops.c | 4 ++-- > 2 files changed, 31 insertions(+), 2 deletions(-) > > diff --git a/gcc/gimple-iterator.h b/gcc/gimple-iterator.h > index 87e943a..76fa456 100644 > --- a/gcc/gimple-iterator.h > +++ b/gcc/gimple-iterator.h > @@ -345,4 +345,33 @@ gsi_seq (gimple_stmt_iterator i) > return *i.seq; > } > > +/* Determine whether SEQ is a nondebug singleton. */ > + > +static inline bool > +gimple_seq_nondebug_singleton_p (gimple_seq seq) > +{ > + gimple_stmt_iterator gsi; > + > + /* Find a nondebug gimple. */ > + gsi.ptr = gimple_seq_first (seq); > + gsi.seq = &seq; > + gsi.bb = NULL; > + while (!gsi_end_p (gsi) > + && is_gimple_debug (gsi_stmt (gsi))) > + gsi_next (&gsi); > + > + /* No nondebug gimple found, not a singleton. */ > + if (gsi_end_p (gsi)) > + return false; > + > + /* Find a next nondebug gimple. */ > + gsi_next (&gsi); > + while (!gsi_end_p (gsi) > + && is_gimple_debug (gsi_stmt (gsi))) > + gsi_next (&gsi); > + > + /* Only a singleton if there's no next nondebug gimple. */ > + return gsi_end_p (gsi); > +} > + > #endif /* GCC_GIMPLE_ITERATOR_H */ > diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c > index 02f44eb..c4b83fe 100644 > --- a/gcc/tree-parloops.c > +++ b/gcc/tree-parloops.c > @@ -1769,8 +1769,8 @@ try_transform_to_exit_first_loop_alt (struct loop *loop, > tree nit) > { > /* Check whether the latch contains a single statement. */ > - if (!gimple_seq_singleton_p (bb_seq (loop->latch))) > - return true; > + if (!gimple_seq_nondebug_singleton_p (bb_seq (loop->latch))) > + return false; > > /* Check whether the latch contains the loop iv increment. */ > edge back = single_succ_edge (loop->latch); > -- > 1.9.1 >
signature.asc
Description: PGP signature