On Mon, Jul 28, 2014 at 11:21:53AM +0200, Tom de Vries wrote: > Jakub, > > we're using expand_omp_for_static_chunk with a chunk_size of one to expand the > openacc loop construct. > > This results in an inner and outer loop being generated, with the inner loop > having a trip count of one, which means that the inner loop can be simplified > to > just the inner loop body. However, subsequent optimizations do not manage to > do > this simplification. > > This patch sets the loop exit condition to true if the chunk_size is one, to > ensure that the compiler will optimize away the inner loop. > > OK for gomp4 branch? > > Thanks, > - Tom
> 2014-07-25 Tom de Vries <t...@codesourcery.com> > > * omp-low.c (expand_omp_for_static_chunk): Remove inner loop if > chunk_size is one. If that is still the case on the trunk, the patch is ok for trunk after retesting it. Please mention the PR tree-optimization/65468 in the ChangeLog entry and make sure there is some runtime testcase that tests that code path (both OpenMP and OpenACC one). > diff --git a/gcc/omp-low.c b/gcc/omp-low.c > index b188e2d..5a73986 100644 > --- a/gcc/omp-low.c > +++ b/gcc/omp-low.c > @@ -7345,9 +7345,14 @@ expand_omp_for_static_chunk (struct omp_region *region, > stmt = gimple_build_assign (vback, t); > gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); > > - t = build2 (fd->loop.cond_code, boolean_type_node, > - DECL_P (vback) && TREE_ADDRESSABLE (vback) > - ? t : vback, e); > + if (tree_int_cst_equal (fd->chunk_size, integer_one_node)) > + t = build2 (EQ_EXPR, boolean_type_node, > + build_int_cst (itype, 0), > + build_int_cst (itype, 1)); > + else > + t = build2 (fd->loop.cond_code, boolean_type_node, > + DECL_P (vback) && TREE_ADDRESSABLE (vback) > + ? t : vback, e); > gsi_insert_before (&gsi, gimple_build_cond_empty (t), GSI_SAME_STMT); > } > Jakub