https://gcc.gnu.org/g:728e95f82cea89a1c5636d639288b924a077508a
commit 728e95f82cea89a1c5636d639288b924a077508a Author: Tobias Burnus <tob...@codesourcery.com> Date: Mon Oct 30 10:53:29 2023 +0100 OpenMP/Fortran: Ensure allocator is gimplified for 'omp allocate' Without this change, we we get an ICE in verify_gimple_call for GOMP_allocate when doing a late replacement in omp-low.cc gcc/fortran/ChangeLog: * trans-openmp.cc (gfc_trans_omp_clauses): Avoid gfc_evaluate_now for allocator with indirect ref for better diagnostic. gcc/ChangeLog: * gcc/gimplify.cc (gimplify_omp_allocate): Gimplify allocator. * omp-low.cc (lower_omp_allocate): Simplify; GOMP_free can also take a plain 0 as allocator argument (arg is unused in libgomp). libgomp/ChangeLog: * testsuite/libgomp.fortran/allocate-8a.f90: New test. Diff: --- gcc/ChangeLog.omp | 6 +++ gcc/fortran/ChangeLog.omp | 5 +++ libgomp/ChangeLog.omp | 4 ++ libgomp/testsuite/libgomp.fortran/allocate-8a.f90 | 45 +++++++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 71b160a3941..2dc54be77f6 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,9 @@ +2023-10-30 Tobias Burnus <tob...@codesourcery.com> + + * gcc/gimplify.cc (gimplify_omp_allocate): Gimplify allocator. + * omp-low.cc (lower_omp_allocate): Simplify; GOMP_free can also + take a plain 0 as allocator argument (arg is unused in libgomp). + 2023-07-14 Julian Brown <jul...@codesourcery.com> * omp-low.cc (lower_omp_target): Reverse iteration over array diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index 9dbfd33eab4..85f76fc0120 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,8 @@ +2023-10-30 Tobias Burnus <tob...@codesourcery.com> + + * trans-openmp.cc (gfc_trans_omp_clauses): Avoid gfc_evaluate_now + for allocator with indirect ref for better diagnostic. + 2023-07-14 Julian Brown <jul...@codesourcery.com> * trans-openmp.cc (gfc_trans_omp_arrayshape_type): Reverse dimension diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index 090341800b5..fad929553cf 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,7 @@ +2023-10-30 Tobias Burnus <tob...@codesourcery.com> + + * testsuite/libgomp.fortran/allocate-8a.f90: New test. + 2023-10-26 Tobias Burnus <tob...@codesourcery.com> * libgomp.texi (OpenMP Impl. Status): Document that 'omp allocate' diff --git a/libgomp/testsuite/libgomp.fortran/allocate-8a.f90 b/libgomp/testsuite/libgomp.fortran/allocate-8a.f90 new file mode 100644 index 00000000000..5f6c8c1e271 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/allocate-8a.f90 @@ -0,0 +1,45 @@ +! { dg-additional-options "-fopenmp-allocators" } +! { dg-additional-options "-fdump-tree-omplower" } +program main + use iso_c_binding + use omp_lib + implicit none (type, external) + integer(omp_allocator_handle_kind):: alloc_h + integer :: i, N + integer(c_intptr_t) :: intptr + integer, allocatable :: A(:) + type(omp_alloctrait):: traits(1) = [omp_alloctrait(omp_atk_alignment, 128)] + + N = 10 + alloc_h = omp_init_allocator(omp_default_mem_space, 1, traits) + + !$omp allocate(A) allocator(alloc_h) + allocate(A(N)) + a(:) = [(i, i=1,N)] + if (mod (transfer (loc(a), intptr),128) /= 0) & + stop 1 + if (any (a /= [(i, i=1,N)])) & + stop 2 + deallocate(A) + !$omp allocate(A) allocator(alloc_h) align(512) + allocate(A(N)) + block + integer, allocatable :: B(:) + !$omp allocators allocate(allocator(alloc_h), align(256) : B) + allocate(B(N)) + B(:) = [(2*i, i=1,N)] + A(:) = B + if (mod (transfer (loc(B), intptr), 256) /= 0) & + stop 1 + ! end of scope deallocation + end block + if (mod (transfer (loc(a), intptr),512) /= 0) & + stop 1 + if (any (a /= [(2*i, i=1,N)])) & + stop 2 + deallocate(A) ! Must deallocate here - before deallocator is destroyed + call omp_destroy_allocator(alloc_h) + ! No auto dealloc of A because it is SAVE +end +! { dg-final { scan-tree-dump-times "__builtin_GOMP_alloc \\(" 3 "omplower" } } +! { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(" 3 "omplower" } }