Skip to content
Snippets Groups Projects
  • Chung-Lin Tang's avatar
    6c039937
    OpenMP 5.0: Remove array section base-pointer mapping semantics and other front-end adjustments · 6c039937
    Chung-Lin Tang authored
    This patch implements three pieces of functionality:
    
    (1) Adjust array section mapping to have standards conforming behavior,
    mapping array sections should *NOT* also map the base-pointer:
    
    struct S { int *ptr; ... };
    struct S s;
    
    Instead of generating this during gimplify:
                                  map(to:*_1 [len: 400]) map(attach:s.ptr [bias: 0])
    
    Now, adjust to:
    
    (i.e. do not map the base-pointer together. The attach operation is still
    generated, and if s.ptr is already mapped prior, attachment will happen)
    
    The correct way of achieving the base-pointer-also-mapped behavior would be to
    use:
    
    (A small Fortran front-end patch to trans-openmp.c:gfc_trans_omp_array_section
     is also included, which removes generation of a GOMP_MAP_ALWAYS_POINTER for
     array types, which appears incorrect and causes a regression in
     libgomp.fortranlibgomp.fortran/struct-elem-map-1.f90)
    
    (2) Related to the first item above, are fixes in libgomp/target.c to not
    overwrite attached pointers when handling device<->host copies, mainly for the
    "always" case.
    
    (3) The third is a set of changes to the C/C++ front-ends to extend the allowed
    component access syntax in map clauses. These changes are enabled for both
    OpenACC and OpenMP.
    
    gcc/c/ChangeLog:
    
    	* c-parser.c (struct omp_dim): New struct type for use inside
    	c_parser_omp_variable_list.
    	(c_parser_omp_variable_list): Allow multiple levels of array and
    	component accesses in array section base-pointer expression.
    	(c_parser_omp_clause_to): Set 'allow_deref' to true in call to
    	c_parser_omp_var_list_parens.
    	(c_parser_omp_clause_from): Likewise.
    	* c-typeck.c (handle_omp_array_sections_1): Extend allowed range
    	of base-pointer expressions involving INDIRECT/MEM/ARRAY_REF and
    	POINTER_PLUS_EXPR.
    	(c_finish_omp_clauses): Extend allowed ranged of expressions
    	involving INDIRECT/MEM/ARRAY_REF and POINTER_PLUS_EXPR.
    
    gcc/cp/ChangeLog:
    
    	* parser.c (struct omp_dim): New struct type for use inside
    	cp_parser_omp_var_list_no_open.
    	(cp_parser_omp_var_list_no_open): Allow multiple levels of array and
    	component accesses in array section base-pointer expression.
    	(cp_parser_omp_all_clauses): Set 'allow_deref' to true in call to
    	cp_parser_omp_var_list for to/from clauses.
    	* semantics.c (handle_omp_array_sections_1): Extend allowed range
    	of base-pointer expressions involving INDIRECT/MEM/ARRAY_REF and
    	POINTER_PLUS_EXPR.
    	(handle_omp_array_sections): Adjust pointer map generation of
    	references.
    	(finish_omp_clauses): Extend allowed ranged of expressions
    	involving INDIRECT/MEM/ARRAY_REF and POINTER_PLUS_EXPR.
    
    gcc/fortran/ChangeLog:
    
    	* trans-openmp.c (gfc_trans_omp_array_section): Do not generate
    	GOMP_MAP_ALWAYS_POINTER map for main array maps of ARRAY_TYPE type.
    
    gcc/ChangeLog:
    
    	* gimplify.c (extract_base_bit_offset): Add 'tree *offsetp' parameter,
    	accomodate case where 'offset' return of get_inner_reference is
    	non-NULL.
    	(is_or_contains_p): Further robustify conditions.
    	(omp_target_reorder_clauses): In alloc/to/from sorting phase, also
    	move following GOMP_MAP_ALWAYS_POINTER maps along.  Add new sorting
    	phase where we make sure pointers with an attach/detach map are ordered
    	correctly.
    	(gimplify_scan_omp_clauses): Add modifications to avoid creating
    	GOMP_MAP_STRUCT and associated alloc map for attach/detach maps.
    
    gcc/testsuite/ChangeLog:
    
    	* c-c++-common/goacc/deep-copy-arrayofstruct.c: Adjust testcase.
    	* c-c++-common/gomp/target-enter-data-1.c: New testcase.
    	* c-c++-common/gomp/target-implicit-map-2.c: New testcase.
    
    libgomp/ChangeLog:
    
    	* target.c (gomp_map_vars_existing): Make sure attached pointer is
    	not overwritten during cross-host/device copying.
    	(gomp_update): Likewise.
    	(gomp_exit_data): Likewise.
    	* testsuite/libgomp.c++/target-11.C: Adjust testcase.
    	* testsuite/libgomp.c++/target-12.C: Likewise.
    	* testsuite/libgomp.c++/target-15.C: Likewise.
    	* testsuite/libgomp.c++/target-16.C: Likewise.
    	* testsuite/libgomp.c++/target-17.C: Likewise.
    	* testsuite/libgomp.c++/target-21.C: Likewise.
    	* testsuite/libgomp.c++/target-23.C: Likewise.
    	* testsuite/libgomp.c/target-23.c: Likewise.
    	* testsuite/libgomp.c/target-29.c: Likewise.
    	* testsuite/libgomp.c-c++-common/target-implicit-map-2.c: New testcase.
    6c039937
    History
    OpenMP 5.0: Remove array section base-pointer mapping semantics and other front-end adjustments
    Chung-Lin Tang authored
    This patch implements three pieces of functionality:
    
    (1) Adjust array section mapping to have standards conforming behavior,
    mapping array sections should *NOT* also map the base-pointer:
    
    struct S { int *ptr; ... };
    struct S s;
    
    Instead of generating this during gimplify:
                                  map(to:*_1 [len: 400]) map(attach:s.ptr [bias: 0])
    
    Now, adjust to:
    
    (i.e. do not map the base-pointer together. The attach operation is still
    generated, and if s.ptr is already mapped prior, attachment will happen)
    
    The correct way of achieving the base-pointer-also-mapped behavior would be to
    use:
    
    (A small Fortran front-end patch to trans-openmp.c:gfc_trans_omp_array_section
     is also included, which removes generation of a GOMP_MAP_ALWAYS_POINTER for
     array types, which appears incorrect and causes a regression in
     libgomp.fortranlibgomp.fortran/struct-elem-map-1.f90)
    
    (2) Related to the first item above, are fixes in libgomp/target.c to not
    overwrite attached pointers when handling device<->host copies, mainly for the
    "always" case.
    
    (3) The third is a set of changes to the C/C++ front-ends to extend the allowed
    component access syntax in map clauses. These changes are enabled for both
    OpenACC and OpenMP.
    
    gcc/c/ChangeLog:
    
    	* c-parser.c (struct omp_dim): New struct type for use inside
    	c_parser_omp_variable_list.
    	(c_parser_omp_variable_list): Allow multiple levels of array and
    	component accesses in array section base-pointer expression.
    	(c_parser_omp_clause_to): Set 'allow_deref' to true in call to
    	c_parser_omp_var_list_parens.
    	(c_parser_omp_clause_from): Likewise.
    	* c-typeck.c (handle_omp_array_sections_1): Extend allowed range
    	of base-pointer expressions involving INDIRECT/MEM/ARRAY_REF and
    	POINTER_PLUS_EXPR.
    	(c_finish_omp_clauses): Extend allowed ranged of expressions
    	involving INDIRECT/MEM/ARRAY_REF and POINTER_PLUS_EXPR.
    
    gcc/cp/ChangeLog:
    
    	* parser.c (struct omp_dim): New struct type for use inside
    	cp_parser_omp_var_list_no_open.
    	(cp_parser_omp_var_list_no_open): Allow multiple levels of array and
    	component accesses in array section base-pointer expression.
    	(cp_parser_omp_all_clauses): Set 'allow_deref' to true in call to
    	cp_parser_omp_var_list for to/from clauses.
    	* semantics.c (handle_omp_array_sections_1): Extend allowed range
    	of base-pointer expressions involving INDIRECT/MEM/ARRAY_REF and
    	POINTER_PLUS_EXPR.
    	(handle_omp_array_sections): Adjust pointer map generation of
    	references.
    	(finish_omp_clauses): Extend allowed ranged of expressions
    	involving INDIRECT/MEM/ARRAY_REF and POINTER_PLUS_EXPR.
    
    gcc/fortran/ChangeLog:
    
    	* trans-openmp.c (gfc_trans_omp_array_section): Do not generate
    	GOMP_MAP_ALWAYS_POINTER map for main array maps of ARRAY_TYPE type.
    
    gcc/ChangeLog:
    
    	* gimplify.c (extract_base_bit_offset): Add 'tree *offsetp' parameter,
    	accomodate case where 'offset' return of get_inner_reference is
    	non-NULL.
    	(is_or_contains_p): Further robustify conditions.
    	(omp_target_reorder_clauses): In alloc/to/from sorting phase, also
    	move following GOMP_MAP_ALWAYS_POINTER maps along.  Add new sorting
    	phase where we make sure pointers with an attach/detach map are ordered
    	correctly.
    	(gimplify_scan_omp_clauses): Add modifications to avoid creating
    	GOMP_MAP_STRUCT and associated alloc map for attach/detach maps.
    
    gcc/testsuite/ChangeLog:
    
    	* c-c++-common/goacc/deep-copy-arrayofstruct.c: Adjust testcase.
    	* c-c++-common/gomp/target-enter-data-1.c: New testcase.
    	* c-c++-common/gomp/target-implicit-map-2.c: New testcase.
    
    libgomp/ChangeLog:
    
    	* target.c (gomp_map_vars_existing): Make sure attached pointer is
    	not overwritten during cross-host/device copying.
    	(gomp_update): Likewise.
    	(gomp_exit_data): Likewise.
    	* testsuite/libgomp.c++/target-11.C: Adjust testcase.
    	* testsuite/libgomp.c++/target-12.C: Likewise.
    	* testsuite/libgomp.c++/target-15.C: Likewise.
    	* testsuite/libgomp.c++/target-16.C: Likewise.
    	* testsuite/libgomp.c++/target-17.C: Likewise.
    	* testsuite/libgomp.c++/target-21.C: Likewise.
    	* testsuite/libgomp.c++/target-23.C: Likewise.
    	* testsuite/libgomp.c/target-23.c: Likewise.
    	* testsuite/libgomp.c/target-29.c: Likewise.
    	* testsuite/libgomp.c-c++-common/target-implicit-map-2.c: New testcase.
target.c 117.86 KiB