On Fri, Mar 07, 2025 at 11:49:37AM +0000, Richard Sandiford wrote:
> > + case TCTX_OMP_DEVICE_ADDR:
> > + if (!silent_p)
> > + error_at (loc, "SVE type %qT not allowed in target device clauses",
> > type);
>
> Is the final error message accurate? This TCTX value is used for clauses
> like use_device_addr, which AIUI are part of "target data". Maybe something
> like "SVE type %qT is not a valid device storage type"?
I think target device clauses is fine, sure, it applies to all of
target{, data, enter data, exit data, update} but I wouldn't read target as
target construct only.
In any case, none of the SVE types make sense in the
is_device_ptr/use_device_addr/use_device_ptr/has_device_addr clauses
unless we'd have offloading from aarch64 host to aarch64 offloading device
with the same properties, because those clauses assume something is on the
offloading device already or similar.
> But TBH I know little about omp, so I hope someone else can suggest
> something better.
>
> Otherwise the AArch64 bits look good to me, to the extent that I'm
> able to review them.
> > --- a/gcc/gimplify.cc
> > +++ b/gcc/gimplify.cc
> > @@ -9081,11 +9081,20 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx,
> > tree decl, bool in_code)
> > | GOVD_MAP_ALLOC_ONLY)) == flags)
> > {
> > tree type = TREE_TYPE (decl);
> > + location_t loc = DECL_SOURCE_LOCATION (decl);
> >
> > if (gimplify_omp_ctxp->target_firstprivatize_array_bases
> > && omp_privatize_by_reference (decl))
> > type = TREE_TYPE (type);
> > - if (!omp_mappable_type (type))
> > +
> > + if (!verify_type_context (loc, TCTX_OMP_MAP_IMP_REF, type))
> > + {
> > + /* Check if TYPE can appear in a target region.
> > + verify_type_context has already issued an error if it
> > + can't. */
> > + nflags |= GOVD_MAP | GOVD_EXPLICIT;
> > + }
Please avoid {} around single statement body.
Otherwise the middle-end changes look ok to me.
> > + else if (!omp_mappable_type (type))
> > {
> > error ("%qD referenced in target region does not have "
> > "a mappable type", decl);
> > @@ -12815,6 +12824,8 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq
> > *pre_p,
> > unsigned int flags;
> > tree decl;
> > auto_vec<omp_addr_token *, 10> addr_tokens;
> > + tree op = NULL_TREE;
> > + location_t loc = OMP_CLAUSE_LOCATION (c);
> >
> > if (grp_end && c == OMP_CLAUSE_CHAIN (grp_end))
> > {
> > @@ -12822,6 +12833,36 @@ gimplify_scan_omp_clauses (tree *list_p,
> > gimple_seq *pre_p,
> > grp_end = NULL_TREE;
> > }
> >
> > + if (code == OMP_TARGET
> > + || code == OMP_TARGET_DATA
> > + || code == OMP_TARGET_ENTER_DATA
> > + || code == OMP_TARGET_EXIT_DATA)
> > + /* Do some target-specific type checks for map operands. */
> > + switch (OMP_CLAUSE_CODE (c))
> > + {
> > + case OMP_CLAUSE_MAP:
> > + op = OMP_CLAUSE_OPERAND (c, 0);
> > + verify_type_context (loc, TCTX_OMP_MAP, TREE_TYPE (op));
> > + break;
> > + case OMP_CLAUSE_PRIVATE:
> > + op = OMP_CLAUSE_OPERAND (c, 0);
> > + verify_type_context (loc, TCTX_OMP_PRIVATE, TREE_TYPE (op));
> > + break;
> > + case OMP_CLAUSE_FIRSTPRIVATE:
> > + op = OMP_CLAUSE_OPERAND (c, 0);
> > + verify_type_context (loc, TCTX_OMP_FIRSTPRIVATE, TREE_TYPE (op));
> > + break;
> > + case OMP_CLAUSE_IS_DEVICE_PTR:
> > + case OMP_CLAUSE_USE_DEVICE_ADDR:
> > + case OMP_CLAUSE_USE_DEVICE_PTR:
> > + case OMP_CLAUSE_HAS_DEVICE_ADDR:
> > + op = OMP_CLAUSE_OPERAND (c, 0);
> > + verify_type_context (loc, TCTX_OMP_DEVICE_ADDR, TREE_TYPE (op));
> > + break;
> > + default:
> > + break;
> > + }
> > +
> > switch (OMP_CLAUSE_CODE (c))
> > {
> > case OMP_CLAUSE_PRIVATE:
> > diff --git a/gcc/target.h b/gcc/target.h
> > index 3e1ee68a341..618c9c03614 100644
> > --- a/gcc/target.h
> > +++ b/gcc/target.h
> > @@ -274,7 +274,24 @@ enum type_context_kind {
> > TCTX_EXCEPTIONS,
> >
> > /* Capturing objects of type T by value in a closure. */
> > - TCTX_CAPTURE_BY_COPY
> > + TCTX_CAPTURE_BY_COPY,
> > +
> > + /* Objects of type T appearing in OpenMP map clause. */
> > + TCTX_OMP_MAP,
> > +
> > + /* Objects of type T appearing in OpenMP target region
> > + without explicit map. */
> > + TCTX_OMP_MAP_IMP_REF,
> > +
> > + /* Objects of type T appearing in OpenMP private clause. */
> > + TCTX_OMP_PRIVATE,
> > +
> > + /* Objects of type T appearing in OpenMP firstprivate clause. */
> > + TCTX_OMP_FIRSTPRIVATE,
> > +
> > + /* Objects of type T appearing in OpenMP device clauses. */
> > + TCTX_OMP_DEVICE_ADDR
> > +
> > };
> >
> > enum poly_value_estimate_kind
> > @@ -331,6 +348,24 @@ mode_can_transfer_bits (machine_mode mode)
> > return true;
> > }
> >
> > +/* Return true if OpenMP context types. */
> > +
> > +inline bool
> > +omp_type_context (type_context_kind context)
> > +{
> > + switch (context)
> > + {
> > + case TCTX_OMP_MAP:
> > + case TCTX_OMP_MAP_IMP_REF:
> > + case TCTX_OMP_PRIVATE:
> > + case TCTX_OMP_FIRSTPRIVATE:
> > + case TCTX_OMP_DEVICE_ADDR:
> > + return true;
> > + default:
> > + return false;
> > + }
> > +}
> > +
> > #ifdef GCC_TM_H
> >
> > #ifndef CUMULATIVE_ARGS_MAGIC
Jakub