On Tue, Sep 01, 2020 at 09:16:23PM +0800, Chung-Lin Tang wrote: > this patch set implements parts of the target mapping changes introduced > in OpenMP 5.0, mainly the attachment requirements for pointer-based > list items, and the clause ordering. > > The first patch here are the C/C++ front-end changes. > > The entire set of changes has been tested for without regressions for > the compiler and libgomp. Hope this is ready to commit to master.
Sorry for the delay in patch review and thanks for the standard citations, that really helps. > gcc/c-family/ > * c-common.h (c_omp_adjust_clauses): New declaration. > * c-omp.c (c_omp_adjust_clauses): New function. Besides the naming, I wonder why is it done in a separate function and so early, can't what the function does be done either in {,c_}finish_omp_clauses (provided we'd pass separate ORT_OMP vs. ORT_OMP_TARGET to it to determine if it is target region vs. anything else), or perhaps even better during gimplification (gimplify_scan_omp_clauses)? > gcc/c/ > * c-parser.c (c_parser_omp_target_data): Add use of > new c_omp_adjust_clauses function. Add GOMP_MAP_ATTACH_DETACH as > handled map clause kind. > (c_parser_omp_target_enter_data): Likewise. > (c_parser_omp_target_exit_data): Likewise. > (c_parser_omp_target): Likewise. > * c-typeck.c (handle_omp_array_sections): Adjust COMPONENT_REF case to > use GOMP_MAP_ATTACH_DETACH map kind for C_ORT_OMP region type. > (c_finish_omp_clauses): Adjust bitmap checks to allow struct decl and > same struct field access to co-exist on OpenMP construct. > > gcc/cp/ > * parser.c (cp_parser_omp_target_data): Add use of > new c_omp_adjust_clauses function. Add GOMP_MAP_ATTACH_DETACH as > handled map clause kind. > (cp_parser_omp_target_enter_data): Likewise. > (cp_parser_omp_target_exit_data): Likewise. > (cp_parser_omp_target): Likewise. > * semantics.c (handle_omp_array_sections): Adjust COMPONENT_REF case to > use GOMP_MAP_ATTACH_DETACH map kind for C_ORT_OMP region type. Fix > interaction between reference case and attach/detach. > (finish_omp_clauses): Adjust bitmap checks to allow struct decl and > same struct field access to co-exist on OpenMP construct. The changelog has some 8 space indented lines. > + for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c)) > + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP > + && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_POINTER > + && TREE_CODE (TREE_TYPE (OMP_CLAUSE_DECL (c))) != ARRAY_TYPE) > + { > + tree ptr = OMP_CLAUSE_DECL (c); > + bool ptr_mapped = false; > + if (is_target) > + { > + for (tree m = clauses; m; m = OMP_CLAUSE_CHAIN (m)) Isn't this O(n^2) in number of clauses? I mean, e.g. for the equality comparisons (but see below) it could be dealt with e.g. using some bitmap with DECL_UIDs. > + if (OMP_CLAUSE_CODE (m) == OMP_CLAUSE_MAP > + && OMP_CLAUSE_DECL (m) == ptr Does it really need to be equality? I mean it will be for map(tofrom:ptr) map(tofrom:ptr[:32]) but what about e.g. map(tofrom:structx) map(tofrom:structx.ptr[:32]) ? It is true that likely we don't parse this yet though. > + && (OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_ALLOC > + || OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_TO > + || OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_FROM > + || OMP_CLAUSE_MAP_KIND (m) == GOMP_MAP_TOFROM)) What about the always modified mapping kinds? > + { > + ptr_mapped = true; > + break; > + } > + > + if (!ptr_mapped > + && DECL_P (ptr) > + && is_global_var (ptr) > + && lookup_attribute ("omp declare target", > + DECL_ATTRIBUTES (ptr))) > + ptr_mapped = true; > + } > + > + /* If the pointer variable was mapped, or if this is not an offloaded > + target region, adjust the map kind to attach/detach. */ > + if (ptr_mapped || !is_target) > + { > + OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_ATTACH_DETACH); > + c_common_mark_addressable_vec (ptr); Though perhaps this is argument why it needs to be done in the FEs and not during gimplification, because it is hard to mark something addressable at that point. > --- a/gcc/c/c-typeck.c > +++ b/gcc/c/c-typeck.c > @@ -13580,16 +13580,17 @@ handle_omp_array_sections (tree c, enum > c_omp_region_type ort) > break; > } > tree c2 = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP); > if (ort != C_ORT_OMP && ort != C_ORT_ACC) > OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_POINTER); > else if (TREE_CODE (t) == COMPONENT_REF) > { > - gomp_map_kind k = (ort == C_ORT_ACC) ? GOMP_MAP_ATTACH_DETACH > - : GOMP_MAP_ALWAYS_POINTER; > + gomp_map_kind k > + = ((ort == C_ORT_ACC || ort == C_ORT_OMP) > + ? GOMP_MAP_ATTACH_DETACH : GOMP_MAP_ALWAYS_POINTER); So what kind of C_ORT_* would be left after this change? C_ORT_*DECLARE_SIMD shouldn't have any kind of array sections in it. So maybe just > OMP_CLAUSE_SET_MAP_KIND (c2, k); OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_ALWAYS_POINTER); ? > if (VAR_P (t) || TREE_CODE (t) == PARM_DECL) > { > - if (bitmap_bit_p (&map_field_head, DECL_UID (t))) > + if (bitmap_bit_p (&map_field_head, DECL_UID (t)) > + || bitmap_bit_p (&map_head, DECL_UID (t))) > break; Shall this change apply to OpenACC too? > } > } > if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL) > { > error_at (OMP_CLAUSE_LOCATION (c), > "%qE is not a variable in %qs clause", t, > @@ -14751,29 +14753,36 @@ c_finish_omp_clauses (tree clauses, enum > c_omp_region_type ort) > error_at (OMP_CLAUSE_LOCATION (c), > "%qD appears both in data and map clauses", t); > remove = true; > } > else > bitmap_set_bit (&generic_head, DECL_UID (t)); > } > - else if (bitmap_bit_p (&map_head, DECL_UID (t))) > + else if (bitmap_bit_p (&map_head, DECL_UID (t)) > + && !bitmap_bit_p (&map_field_head, DECL_UID (t))) Ditto. Otherwise, what shall this diagnose now that the restriction that the same list item may not appear in multiple clauses is gone. > { > if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP) > error_at (OMP_CLAUSE_LOCATION (c), > "%qD appears more than once in motion clauses", t); > else if (ort == C_ORT_ACC) > error_at (OMP_CLAUSE_LOCATION (c), > "%qD appears more than once in data clauses", t); > else > error_at (OMP_CLAUSE_LOCATION (c), > "%qD appears more than once in map clauses", t); > remove = true; So what is this supposed to diagnose now that the restriction that C++ ditto. Jakub