Skip to content
Snippets Groups Projects
  • Tobias Burnus's avatar
    d4b6d147
    OpenMP/Fortran: Implement omp allocators/allocate for ptr/allocatables · d4b6d147
    Tobias Burnus authored
    This commit adds -fopenmp-allocators which enables support for
    'omp allocators' and 'omp allocate' that are associated with a Fortran
    allocate-stmt. If such a construct is encountered, an error is shown,
    unless the -fopenmp-allocators flag is present.
    
    With -fopenmp -fopenmp-allocators, those constructs get turned into
    GOMP_alloc allocations, while -fopenmp-allocators (also without -fopenmp)
    ensures deallocation and reallocation (via intrinsic assignments) are
    properly directed to GOMP_free/omp_realloc - while normal Fortran
    allocations are processed by free/realloc.
    
    In order to distinguish a 'malloc'ed from a 'GOMP_alloc'ed memory, the
    version field of the Fortran array discriptor is (mis)used: 0 indicates
    the normal Fortran allocation while 1 denotes GOMP_alloc. For scalars,
    there is record keeping in libgomp: GOMP_add_alloc(ptr) will add the
    pointer address to a splay_tree while GOMP_is_alloc(ptr) will return
    true it was previously added but also removes it from the list.
    
    Besides Fortran FE work, BUILT_IN_GOMP_REALLOC is no part of
    omp-builtins.def and libgomp gains the mentioned two new function.
    
    gcc/ChangeLog:
    
    	* builtin-types.def (BT_FN_PTR_PTR_SIZE_PTRMODE_PTRMODE): New.
    	* omp-builtins.def (BUILT_IN_GOMP_REALLOC): New.
    	* builtins.cc (builtin_fnspec): Handle it.
    	* gimple-ssa-warn-access.cc (fndecl_alloc_p,
    	matching_alloc_calls_p): Likewise.
    	* gimple.cc (nonfreeing_call_p): Likewise.
    	* predict.cc (expr_expected_value_1): Likewise.
    	* tree-ssa-ccp.cc (evaluate_stmt): Likewise.
    	* tree.cc (fndecl_dealloc_argno): Likewise.
    
    gcc/fortran/ChangeLog:
    
    	* dump-parse-tree.cc (show_omp_node): Handle EXEC_OMP_ALLOCATE
    	and EXEC_OMP_ALLOCATORS.
    	* f95-lang.cc (ATTR_ALLOC_WARN_UNUSED_RESULT_SIZE_2_NOTHROW_LIST):
    	Add 'ECF_LEAF | ECF_MALLOC' to existing 'ECF_NOTHROW'.
    	(ATTR_ALLOC_WARN_UNUSED_RESULT_SIZE_2_NOTHROW_LEAF_LIST): Define.
    	* gfortran.h (gfc_omp_clauses): Add contained_in_target_construct.
    	* invoke.texi (-fopenacc, -fopenmp): Update based on C version.
    	(-fopenmp-simd): New, based on C version.
    	(-fopenmp-allocators): New.
    	* lang.opt (fopenmp-allocators): Add.
    	* openmp.cc (resolve_omp_clauses): For allocators/allocate directive,
    	add target and no dynamic_allocators diagnostic and more invalid
    	diagnostic.
    	* parse.cc (decode_omp_directive): Set contains_teams_construct.
    	* trans-array.h (gfc_array_allocate): Update prototype.
    	(gfc_conv_descriptor_version): New prototype.
    	* trans-decl.cc (gfc_init_default_dt): Fix comment.
    	* trans-array.cc (gfc_conv_descriptor_version): New.
    	(gfc_array_allocate): Support GOMP_alloc allocation.
    	(gfc_alloc_allocatable_for_assignment, structure_alloc_comps):
    	Handle GOMP_free/omp_realloc as needed.
    	* trans-expr.cc (gfc_conv_procedure_call): Likewise.
    	(alloc_scalar_allocatable_for_assignment): Likewise.
    	* trans-intrinsic.cc (conv_intrinsic_move_alloc): Likewise.
    	* trans-openmp.cc (gfc_trans_omp_allocators,
    	gfc_trans_omp_directive): Handle allocators/allocate directive.
    	(gfc_omp_call_add_alloc, gfc_omp_call_is_alloc): New.
    	* trans-stmt.h (gfc_trans_allocate): Update prototype.
    	* trans-stmt.cc (gfc_trans_allocate): Support GOMP_alloc.
    	* trans-types.cc (gfc_get_dtype_rank_type): Set version field.
    	* trans.cc (gfc_allocate_using_malloc, gfc_allocate_allocatable):
    	Update to handle GOMP_alloc.
    	(gfc_deallocate_with_status, gfc_deallocate_scalar_with_status):
    	Handle GOMP_free.
    	(trans_code): Update call.
    	* trans.h (gfc_allocate_allocatable, gfc_allocate_using_malloc):
    	Update prototype.
    	(gfc_omp_call_add_alloc, gfc_omp_call_is_alloc): New prototype.
    	* types.def (BT_FN_PTR_PTR_SIZE_PTRMODE_PTRMODE): New.
    
    libgomp/ChangeLog:
    
    	* allocator.c (struct fort_alloc_splay_tree_key_s,
    	fort_alloc_splay_compare, GOMP_add_alloc, GOMP_is_alloc): New.
    	* libgomp.h: Define splay_tree_static for 'reverse' splay tree.
    	* libgomp.map (GOMP_5.1.2): New; add GOMP_add_alloc and
    	GOMP_is_alloc; move GOMP_target_map_indirect_ptr from ...
    	(GOMP_5.1.1): ... here.
    	* libgomp.texi (Impl. Status, Memory management): Update for
    	allocators/allocate directives.
    	* splay-tree.c: Handle splay_tree_static define to declare all
    	functions as static.
    	(splay_tree_lookup_node): New.
    	* splay-tree.h: Handle splay_tree_decl_only define.
    	(splay_tree_lookup_node): New prototype.
    	* target.c: Define splay_tree_static for 'reverse'.
    	* testsuite/libgomp.fortran/allocators-1.f90: New test.
    	* testsuite/libgomp.fortran/allocators-2.f90: New test.
    	* testsuite/libgomp.fortran/allocators-3.f90: New test.
    	* testsuite/libgomp.fortran/allocators-4.f90: New test.
    	* testsuite/libgomp.fortran/allocators-5.f90: New test.
    
    gcc/testsuite/ChangeLog:
    
    	* gfortran.dg/gomp/allocate-14.f90: Add coarray and
    	not-listed tests.
    	* gfortran.dg/gomp/allocate-5.f90: Remove sorry dg-message.
    	* gfortran.dg/bind_c_array_params_2.f90: Update expected
    	dump for dtype '.version=0'.
    	* gfortran.dg/gomp/allocate-16.f90: New test.
    	* gfortran.dg/gomp/allocators-3.f90: New test.
    	* gfortran.dg/gomp/allocators-4.f90: New test.
    d4b6d147
    History
    OpenMP/Fortran: Implement omp allocators/allocate for ptr/allocatables
    Tobias Burnus authored
    This commit adds -fopenmp-allocators which enables support for
    'omp allocators' and 'omp allocate' that are associated with a Fortran
    allocate-stmt. If such a construct is encountered, an error is shown,
    unless the -fopenmp-allocators flag is present.
    
    With -fopenmp -fopenmp-allocators, those constructs get turned into
    GOMP_alloc allocations, while -fopenmp-allocators (also without -fopenmp)
    ensures deallocation and reallocation (via intrinsic assignments) are
    properly directed to GOMP_free/omp_realloc - while normal Fortran
    allocations are processed by free/realloc.
    
    In order to distinguish a 'malloc'ed from a 'GOMP_alloc'ed memory, the
    version field of the Fortran array discriptor is (mis)used: 0 indicates
    the normal Fortran allocation while 1 denotes GOMP_alloc. For scalars,
    there is record keeping in libgomp: GOMP_add_alloc(ptr) will add the
    pointer address to a splay_tree while GOMP_is_alloc(ptr) will return
    true it was previously added but also removes it from the list.
    
    Besides Fortran FE work, BUILT_IN_GOMP_REALLOC is no part of
    omp-builtins.def and libgomp gains the mentioned two new function.
    
    gcc/ChangeLog:
    
    	* builtin-types.def (BT_FN_PTR_PTR_SIZE_PTRMODE_PTRMODE): New.
    	* omp-builtins.def (BUILT_IN_GOMP_REALLOC): New.
    	* builtins.cc (builtin_fnspec): Handle it.
    	* gimple-ssa-warn-access.cc (fndecl_alloc_p,
    	matching_alloc_calls_p): Likewise.
    	* gimple.cc (nonfreeing_call_p): Likewise.
    	* predict.cc (expr_expected_value_1): Likewise.
    	* tree-ssa-ccp.cc (evaluate_stmt): Likewise.
    	* tree.cc (fndecl_dealloc_argno): Likewise.
    
    gcc/fortran/ChangeLog:
    
    	* dump-parse-tree.cc (show_omp_node): Handle EXEC_OMP_ALLOCATE
    	and EXEC_OMP_ALLOCATORS.
    	* f95-lang.cc (ATTR_ALLOC_WARN_UNUSED_RESULT_SIZE_2_NOTHROW_LIST):
    	Add 'ECF_LEAF | ECF_MALLOC' to existing 'ECF_NOTHROW'.
    	(ATTR_ALLOC_WARN_UNUSED_RESULT_SIZE_2_NOTHROW_LEAF_LIST): Define.
    	* gfortran.h (gfc_omp_clauses): Add contained_in_target_construct.
    	* invoke.texi (-fopenacc, -fopenmp): Update based on C version.
    	(-fopenmp-simd): New, based on C version.
    	(-fopenmp-allocators): New.
    	* lang.opt (fopenmp-allocators): Add.
    	* openmp.cc (resolve_omp_clauses): For allocators/allocate directive,
    	add target and no dynamic_allocators diagnostic and more invalid
    	diagnostic.
    	* parse.cc (decode_omp_directive): Set contains_teams_construct.
    	* trans-array.h (gfc_array_allocate): Update prototype.
    	(gfc_conv_descriptor_version): New prototype.
    	* trans-decl.cc (gfc_init_default_dt): Fix comment.
    	* trans-array.cc (gfc_conv_descriptor_version): New.
    	(gfc_array_allocate): Support GOMP_alloc allocation.
    	(gfc_alloc_allocatable_for_assignment, structure_alloc_comps):
    	Handle GOMP_free/omp_realloc as needed.
    	* trans-expr.cc (gfc_conv_procedure_call): Likewise.
    	(alloc_scalar_allocatable_for_assignment): Likewise.
    	* trans-intrinsic.cc (conv_intrinsic_move_alloc): Likewise.
    	* trans-openmp.cc (gfc_trans_omp_allocators,
    	gfc_trans_omp_directive): Handle allocators/allocate directive.
    	(gfc_omp_call_add_alloc, gfc_omp_call_is_alloc): New.
    	* trans-stmt.h (gfc_trans_allocate): Update prototype.
    	* trans-stmt.cc (gfc_trans_allocate): Support GOMP_alloc.
    	* trans-types.cc (gfc_get_dtype_rank_type): Set version field.
    	* trans.cc (gfc_allocate_using_malloc, gfc_allocate_allocatable):
    	Update to handle GOMP_alloc.
    	(gfc_deallocate_with_status, gfc_deallocate_scalar_with_status):
    	Handle GOMP_free.
    	(trans_code): Update call.
    	* trans.h (gfc_allocate_allocatable, gfc_allocate_using_malloc):
    	Update prototype.
    	(gfc_omp_call_add_alloc, gfc_omp_call_is_alloc): New prototype.
    	* types.def (BT_FN_PTR_PTR_SIZE_PTRMODE_PTRMODE): New.
    
    libgomp/ChangeLog:
    
    	* allocator.c (struct fort_alloc_splay_tree_key_s,
    	fort_alloc_splay_compare, GOMP_add_alloc, GOMP_is_alloc): New.
    	* libgomp.h: Define splay_tree_static for 'reverse' splay tree.
    	* libgomp.map (GOMP_5.1.2): New; add GOMP_add_alloc and
    	GOMP_is_alloc; move GOMP_target_map_indirect_ptr from ...
    	(GOMP_5.1.1): ... here.
    	* libgomp.texi (Impl. Status, Memory management): Update for
    	allocators/allocate directives.
    	* splay-tree.c: Handle splay_tree_static define to declare all
    	functions as static.
    	(splay_tree_lookup_node): New.
    	* splay-tree.h: Handle splay_tree_decl_only define.
    	(splay_tree_lookup_node): New prototype.
    	* target.c: Define splay_tree_static for 'reverse'.
    	* testsuite/libgomp.fortran/allocators-1.f90: New test.
    	* testsuite/libgomp.fortran/allocators-2.f90: New test.
    	* testsuite/libgomp.fortran/allocators-3.f90: New test.
    	* testsuite/libgomp.fortran/allocators-4.f90: New test.
    	* testsuite/libgomp.fortran/allocators-5.f90: New test.
    
    gcc/testsuite/ChangeLog:
    
    	* gfortran.dg/gomp/allocate-14.f90: Add coarray and
    	not-listed tests.
    	* gfortran.dg/gomp/allocate-5.f90: Remove sorry dg-message.
    	* gfortran.dg/bind_c_array_params_2.f90: Update expected
    	dump for dtype '.version=0'.
    	* gfortran.dg/gomp/allocate-16.f90: New test.
    	* gfortran.dg/gomp/allocators-3.f90: New test.
    	* gfortran.dg/gomp/allocators-4.f90: New test.