[gomp4.1] C++ iterators with #omp ordered depend(sink:)
Jakub Jelinek
jakub@redhat.com
Thu Jul 16 07:16:00 GMT 2015
Hi!
CCing Jason on a tsubst issue below.
On Wed, Jul 15, 2015 at 06:05:06PM -0700, Aldy Hernandez wrote:
> As I said on IRC, this looks ugly, but I can see why you wouldn't want the
> extra word on all loop variants. I've implemented it as requested.
Thanks.
> commit f55eced4ac6b045101a90914a8f27e99d26cfddf
> Author: Aldy Hernandez <aldyh@redhat.com>
> Date: Tue Jul 14 19:23:09 2015 -0700
>
> * gimplify.c (gimplify_omp_for): Use OMP_FOR_ORIG_DECLS.
> * tree.def (omp_for): Add new operand.
> * tree.h (OMP_FOR_ORIG_DECLS): New macro.
> c-family/
> * c-common.h (c_finish_omp_for): Add argument.
> * c-omp.c (c_finish_omp_for): Set OMP_FOR_ORIG_DECLS.
> cp/
> * cp-tree.h (finish_omp_for): Add new argument.
> * parser.c (cp_parser_omp_for_loop): Pass new argument.
> * pt.c (tsubst_omp_for_iterator): New argument orig_declv.
> Set OMP_FOR_ORIG_DECLS from orig_declv if available.
> (tsubst_expr): Pass new vector to tsubst_omp_for_iterator.
> * semantics.c (finish_omp_for): Pass original DECLs to
> c_finish_omp_for.
> Set OMP_FOR_ORIG_DECLS.
> c/
> * c-parser.c (c_parser_omp_for_loop): Pass new argument to
> c_finish_omp_for.
Can you please add the
testsuite/
additions to ChangeLog too?
> @@ -13828,6 +13828,16 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv,
>
> init = TREE_VEC_ELT (OMP_FOR_INIT (t), i);
> gcc_assert (TREE_CODE (init) == MODIFY_EXPR);
> +
> + if (orig_declv && OMP_FOR_ORIG_DECLS (t))
> + {
> + tree o = TREE_VEC_ELT (OMP_FOR_ORIG_DECLS (t), i);
> + tree spec = retrieve_local_specialization (o);
> + if (spec)
> + o = spec;
Why doesn't o = RECUR (o); work here? Or tsubst_copy?
>From my experience tsubst_expr can result in (here undesirable) convert_from_reference
if the decl has type of e.g. template parameter and you instantiate with
some reference type. But, that can only happen if the decl is dependent,
see below:
> @@ -14468,6 +14479,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
> if (OMP_FOR_INIT (t) != NULL_TREE)
> {
> declv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t)));
> + if (TREE_CODE (t) == OMP_FOR)
> + orig_declv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t)));
I'd have expected to guard this also with
if (TREE_CODE (t) == OMP_FOR && OMP_FOR_ORIG_DECLS (t) != NULL_TREE)
> @@ -7302,6 +7303,9 @@ finish_omp_for (location_t locus, enum tree_code code, tree declv, tree initv,
> TREE_VEC_ELT (initv, i) = init;
> }
>
> + if (!orig_declv || !TREE_VEC_LENGTH (orig_declv))
> + orig_declv = copy_node (declv);
When is TREE_VEC_LENGTH 0? Furthermore, I'd do this only after the
if (dependent_omp_for_p ())
> +
> if (dependent_omp_for_p (declv, initv, condv, incrv))
> {
> tree stmt;
> @@ -7325,6 +7329,8 @@ finish_omp_for (location_t locus, enum tree_code code, tree declv, tree initv,
> OMP_FOR_BODY (stmt) = body;
> OMP_FOR_PRE_BODY (stmt) = pre_body;
> OMP_FOR_CLAUSES (stmt) = clauses;
> + if (code == OMP_FOR)
> + OMP_FOR_ORIG_DECLS (stmt) = orig_declv;
And leave this out. If something is dependent, we don't really modify it
before instantiation, thus there is no need to make a copy. During
instantiation another finish_omp_for will be called, then declv, initv,
condv, incrv won't be dependent and we can orig_declv = copy_node (declv).
> diff --git a/gcc/testsuite/c-c++-common/gomp/sink-2.c b/gcc/testsuite/c-c++-common/gomp/sink-2.c
> new file mode 100644
> index 0000000..7a075d4
> --- /dev/null
> +++ b/gcc/testsuite/c-c++-common/gomp/sink-2.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile } */
> +
> +void bar (int *);
> +
> +void
> +foo ()
> +{
> + int i,j;
> +#pragma omp parallel for ordered(1)
> + for (i=0; i < 100; ++i)
> + {
> +#pragma omp ordered depend(sink:i-1)
> + bar(&i);
Can you please add #pragma omp ordered depend(source) below the bar call?
Jakub
More information about the Gcc-patches
mailing list