From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1729) id 396AD384D18D; Wed, 29 Jun 2022 14:45:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 396AD384D18D Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Kwok Yeung To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/omp/gcc-12] Lower allocate directive (OpenMP 5.0). X-Act-Checkin: gcc X-Git-Author: Hafiz Abid Qadeer X-Git-Refname: refs/heads/devel/omp/gcc-12 X-Git-Oldrev: 37e3970a0eca920621e2aa06d6893e7aa1f8f921 X-Git-Newrev: d4ef751715f8c808e1cc15dab9f04f9c45062669 Message-Id: <20220629144510.396AD384D18D@sourceware.org> Date: Wed, 29 Jun 2022 14:45:10 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Jun 2022 14:45:10 -0000 https://gcc.gnu.org/g:d4ef751715f8c808e1cc15dab9f04f9c45062669 commit d4ef751715f8c808e1cc15dab9f04f9c45062669 Author: Hafiz Abid Qadeer Date: Wed Mar 9 14:09:45 2022 +0000 Lower allocate directive (OpenMP 5.0). Backport of a patch posted at https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588372.html This patch looks for malloc/free calls that were generated by allocate statement that is associated with allocate directive and replaces them with GOMP_alloc and GOMP_free. gcc/ChangeLog: * omp-low.cc (scan_sharing_clauses): Handle OMP_CLAUSE_ALLOCATOR. (scan_omp_allocate): New. (scan_omp_1_stmt): Call it. (lower_omp_allocate): New function. (lower_omp_1): Call it. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/allocate-6.f90: Add tests. * gfortran.dg/gomp/allocate-7.f90: New test. * gfortran.dg/gomp/allocate-8.f90: New test. libgomp/ChangeLog: * testsuite/libgomp.fortran/allocate-2.f90: New test. Diff: --- gcc/ChangeLog.omp | 11 ++ gcc/omp-low.cc | 135 +++++++++++++++++++++++ gcc/testsuite/ChangeLog.omp | 9 ++ gcc/testsuite/gfortran.dg/gomp/allocate-6.f90 | 9 ++ gcc/testsuite/gfortran.dg/gomp/allocate-7.f90 | 13 +++ gcc/testsuite/gfortran.dg/gomp/allocate-8.f90 | 15 +++ libgomp/ChangeLog.omp | 7 ++ libgomp/testsuite/libgomp.fortran/allocate-2.f90 | 52 +++++++++ 8 files changed, 251 insertions(+) diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 150b7fda843..8668d76babd 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,14 @@ +2022-03-09 Abid Qadeer + + Backport of a patch posted at + https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588372.html + + * omp-low.cc (scan_sharing_clauses): Handle OMP_CLAUSE_ALLOCATOR. + (scan_omp_allocate): New. + (scan_omp_1_stmt): Call it. + (lower_omp_allocate): New function. + (lower_omp_1): Call it. + 2022-03-09 Abid Qadeer Backport of a patch posted at diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc index 4d50d87b1ac..aaa3396b006 100644 --- a/gcc/omp-low.cc +++ b/gcc/omp-low.cc @@ -2023,6 +2023,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx, case OMP_CLAUSE_FINALIZE: case OMP_CLAUSE_TASK_REDUCTION: case OMP_CLAUSE_ALLOCATE: + case OMP_CLAUSE_ALLOCATOR: break; case OMP_CLAUSE_ALIGNED: @@ -2246,6 +2247,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx, case OMP_CLAUSE_FINALIZE: case OMP_CLAUSE_FILTER: case OMP_CLAUSE__CONDTEMP_: + case OMP_CLAUSE_ALLOCATOR: break; case OMP_CLAUSE__CACHE_: @@ -3343,6 +3345,16 @@ scan_omp_simd_scan (gimple_stmt_iterator *gsi, gomp_for *stmt, maybe_lookup_ctx (new_stmt)->for_simd_scan_phase = true; } +/* Scan an OpenMP allocate directive. */ + +static void +scan_omp_allocate (gomp_allocate *stmt, omp_context *outer_ctx) +{ + omp_context *ctx; + ctx = new_omp_context (stmt, outer_ctx); + scan_sharing_clauses (gimple_omp_allocate_clauses (stmt), ctx); +} + /* Scan an OpenMP sections directive. */ static void @@ -4777,6 +4789,9 @@ scan_omp_1_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p, insert_decl_map (&ctx->cb, var, var); } break; + case GIMPLE_OMP_ALLOCATE: + scan_omp_allocate (as_a (stmt), ctx); + break; default: *handled_ops_p = false; break; @@ -9287,6 +9302,121 @@ lower_omp_single_simple (gomp_single *single_stmt, gimple_seq *pre_p) gimple_seq_add_stmt (pre_p, gimple_build_label (flabel)); } +static void +lower_omp_allocate (gimple_stmt_iterator *gsi_p, omp_context *ctx) +{ + gomp_allocate *st = as_a (gsi_stmt (*gsi_p)); + tree clauses = gimple_omp_allocate_clauses (st); + int kind = gimple_omp_allocate_kind (st); + gcc_assert (kind == GF_OMP_ALLOCATE_KIND_ALLOCATE + || kind == GF_OMP_ALLOCATE_KIND_FREE); + bool allocate = (kind == GF_OMP_ALLOCATE_KIND_ALLOCATE); + + for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c)) + { + if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_ALLOCATOR) + continue; + + /* The allocate directives that appear in a target region must specify + an allocator clause unless a requires directive with the + dynamic_allocators clause is present in the same compilation unit. */ + if (OMP_ALLOCATE_ALLOCATOR (c) == NULL_TREE + && ((omp_requires_mask & OMP_REQUIRES_DYNAMIC_ALLOCATORS) == 0) + && omp_maybe_offloaded_ctx (ctx)) + error_at (OMP_CLAUSE_LOCATION (c), "% directive must" + " specify an allocator here"); + + tree var = OMP_ALLOCATE_DECL (c); + + gimple_stmt_iterator gsi = *gsi_p; + for (gsi_next (&gsi); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple *stmt = gsi_stmt (gsi); + + if (gimple_code (stmt) != GIMPLE_CALL + || (allocate && gimple_call_fndecl (stmt) + != builtin_decl_explicit (BUILT_IN_MALLOC)) + || (!allocate && gimple_call_fndecl (stmt) + != builtin_decl_explicit (BUILT_IN_FREE))) + continue; + const gcall *gs = as_a (stmt); + tree allocator = OMP_ALLOCATE_ALLOCATOR (c) + ? OMP_ALLOCATE_ALLOCATOR (c) + : integer_zero_node; + if (allocate) + { + tree lhs = gimple_call_lhs (gs); + if (lhs && TREE_CODE (lhs) == SSA_NAME) + { + gimple_stmt_iterator gsi2 = gsi; + gsi_next (&gsi2); + gimple *assign = gsi_stmt (gsi2); + if (gimple_code (assign) == GIMPLE_ASSIGN) + { + lhs = gimple_assign_lhs (as_a (assign)); + if (lhs == NULL_TREE + || TREE_CODE (lhs) != COMPONENT_REF) + continue; + lhs = TREE_OPERAND (lhs, 0); + } + } + + if (lhs == var) + { + unsigned HOST_WIDE_INT ialign = 0; + tree align; + if (TYPE_P (var)) + ialign = TYPE_ALIGN_UNIT (var); + else + ialign = DECL_ALIGN_UNIT (var); + align = build_int_cst (size_type_node, ialign); + tree repl = builtin_decl_explicit (BUILT_IN_GOMP_ALLOC); + tree size = gimple_call_arg (gs, 0); + gimple *g = gimple_build_call (repl, 3, align, size, + allocator); + gimple_call_set_lhs (g, gimple_call_lhs (gs)); + gimple_set_location (g, gimple_location (stmt)); + gsi_replace (&gsi, g, true); + } + } + else + { + tree arg = gimple_call_arg (gs, 0); + if (arg && TREE_CODE (arg) == SSA_NAME) + { + gimple_stmt_iterator gsi2 = gsi; + gsi_prev (&gsi2); + if (!gsi_end_p (gsi2)) + { + gimple *gs = gsi_stmt (gsi2); + if (gimple_code (gs) == GIMPLE_ASSIGN) + { + const gassign *assign = as_a (gs); + tree rhs = gimple_assign_rhs1 (assign); + tree lhs = gimple_assign_lhs (assign); + if (lhs == arg && rhs + && TREE_CODE (rhs) == COMPONENT_REF) + arg = TREE_OPERAND (rhs, 0); + } + } + } + + if (arg == var) + { + tree repl = builtin_decl_explicit (BUILT_IN_GOMP_FREE); + gimple *g = gimple_build_call (repl, 2, + gimple_call_arg (gs, 0), + allocator); + gimple_set_location (g, gimple_location (stmt)); + gsi_replace (&gsi, g, true); + break; + } + } + } + } + gsi_replace (gsi_p, gimple_build_nop (), true); +} + /* A subroutine of lower_omp_single. Expand the simple form of a GIMPLE_OMP_SINGLE, with a copyprivate clause: @@ -15294,6 +15424,11 @@ lower_omp_1 (gimple_stmt_iterator *gsi_p, omp_context *ctx) gcc_assert (ctx); lower_omp_scope (gsi_p, ctx); break; + case GIMPLE_OMP_ALLOCATE: + ctx = maybe_lookup_ctx (stmt); + gcc_assert (ctx); + lower_omp_allocate (gsi_p, ctx); + break; case GIMPLE_OMP_SINGLE: ctx = maybe_lookup_ctx (stmt); gcc_assert (ctx); diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index 035a4712b57..8367e4995f3 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,12 @@ +2022-03-09 Abid Qadeer + + Backport of a patch posted at + https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588372.html + + * gfortran.dg/gomp/allocate-6.f90: Add tests. + * gfortran.dg/gomp/allocate-7.f90: New test. + * gfortran.dg/gomp/allocate-8.f90: New test. + 2022-03-09 Abid Qadeer Backport of a patch posted at diff --git a/gcc/testsuite/gfortran.dg/gomp/allocate-6.f90 b/gcc/testsuite/gfortran.dg/gomp/allocate-6.f90 index 6957bc55da0..738d9936f6a 100644 --- a/gcc/testsuite/gfortran.dg/gomp/allocate-6.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/allocate-6.f90 @@ -1,5 +1,6 @@ ! { dg-do compile } ! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" } +! { dg-additional-options "-fdump-tree-omplower" } module omp_lib_kinds use iso_c_binding, only: c_int, c_intptr_t @@ -47,6 +48,7 @@ end type real, allocatable :: var3(:,:) type (my_type), allocatable :: var4 integer, pointer :: pii, parr(:) + integer, allocatable :: var character, allocatable :: str1a, str1aarr(:) character(len=5), allocatable :: str5a, str5aarr(:) @@ -67,9 +69,16 @@ end type !$omp allocate allocate(pii, parr(5)) + + ! allocate statement not associated with an allocate directive + allocate(var) end subroutine ! { dg-final { scan-tree-dump-times "#pragma omp allocate \\(kind=allocate\\)" 6 "original" } } ! { dg-final { scan-tree-dump "#pragma omp allocate \\(kind=free\\)" "original" } } ! { dg-final { scan-tree-dump-times "#pragma omp allocate \\(kind=allocate\\)" 6 "gimple" } } ! { dg-final { scan-tree-dump "#pragma omp allocate \\(kind=free\\)" "gimple" } } +! { dg-final { scan-tree-dump-times "builtin_malloc" 11 "original" } } +! { dg-final { scan-tree-dump-times "builtin_free" 9 "original" } } +! { dg-final { scan-tree-dump-times "GOMP_alloc" 10 "omplower" } } +! { dg-final { scan-tree-dump-times "GOMP_free" 8 "omplower" } } diff --git a/gcc/testsuite/gfortran.dg/gomp/allocate-7.f90 b/gcc/testsuite/gfortran.dg/gomp/allocate-7.f90 new file mode 100644 index 00000000000..db76e901c08 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/allocate-7.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } + +subroutine bar(a) + implicit none + integer :: a + integer, allocatable :: var +!$omp target + !$omp allocate (var) ! { dg-error "'allocate' directive must specify an allocator here" } + allocate (var) +!$omp end target + +end subroutine + diff --git a/gcc/testsuite/gfortran.dg/gomp/allocate-8.f90 b/gcc/testsuite/gfortran.dg/gomp/allocate-8.f90 new file mode 100644 index 00000000000..699a3b80878 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/allocate-8.f90 @@ -0,0 +1,15 @@ +! { dg-do compile } + + +subroutine bar(a) + implicit none + integer :: a + integer, allocatable :: var +!$omp requires dynamic_allocators +!$omp target + !$omp allocate (var) + allocate (var) +!$omp end target + +end subroutine + diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index 6c18c2564fa..5c503fcb624 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,10 @@ +2022-03-09 Abid Qadeer + + Backport of a patch posted at + https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588372.html + + * testsuite/libgomp.fortran/allocate-2.f90: New test. + 2022-03-01 Tobias Burnus * testsuite/libgomp.fortran/allocatable-comp.f90: New test. diff --git a/libgomp/testsuite/libgomp.fortran/allocate-2.f90 b/libgomp/testsuite/libgomp.fortran/allocate-2.f90 new file mode 100644 index 00000000000..fdd69d7de18 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/allocate-2.f90 @@ -0,0 +1,52 @@ +! { dg-do run } +! { dg-additional-sources allocate-1.c } +! { dg-prune-output "command-line option '-fintrinsic-modules-path=.*' is valid for Fortran but not for C" } + +module m + use omp_lib + use iso_c_binding + implicit none + interface + integer(c_int) function is_64bit_aligned (a) bind(C) + import :: c_int + integer :: a + end + end interface + +contains + +subroutine foo (x, y, h) + use omp_lib + !use iso_c_binding + integer :: x + integer :: y + integer (kind=omp_allocator_handle_kind) :: h + integer, allocatable :: var1 + !integer, allocatable :: var2(:) + + !$omp allocate (var1) allocator(h) + allocate (var1) + + !y = 1 + if (is_64bit_aligned(var1) == 0) then + stop 19 + end if + +end subroutine +end module m + +program main + use omp_lib + use m + type (omp_alloctrait) :: traits(3) + integer (omp_allocator_handle_kind) :: a + + traits = [omp_alloctrait (omp_atk_alignment, 64), & + omp_alloctrait (omp_atk_fallback, omp_atv_null_fb), & + omp_alloctrait (omp_atk_pool_size, 8192)] + a = omp_init_allocator (omp_default_mem_space, 3, traits) + if (a == omp_null_allocator) stop 1 + !call omp_set_default_allocator (omp_default_mem_alloc); + call foo (42, 12, a); + call omp_destroy_allocator (a); +end