From 5130a4ea121fa74b0fe9a0c9a44ede651f94f93a Mon Sep 17 00:00:00 2001 From: Leandro Lupori Date: Tue, 7 Jan 2025 14:00:39 -0300 Subject: [PATCH] [flang][OpenMP] Handle pointers and allocatables in clone init (#121824) InitializeClone(), implemented in #120295, was not handling top level pointers and allocatables correctly. Pointers and unallocated variables must be skipped. This caused some regressions in the Fujitsu testsuite: https://linaro.atlassian.net/browse/LLVM-1488 --- flang/lib/Lower/OpenMP/DataSharingProcessor.cpp | 3 ++- flang/runtime/derived.cpp | 4 ++++ flang/test/Lower/OpenMP/derived-type-allocatable.f90 | 11 +++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp index cd312537551e..9dfdbd8337ae 100644 --- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp +++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp @@ -126,7 +126,8 @@ void DataSharingProcessor::cloneSymbol(const semantics::Symbol *sym) { assert(sb); mlir::Value addr = sb.getAddr(); assert(addr); - return hlfir::mayHaveAllocatableComponent(addr.getType()); + return !fir::isPointerType(addr.getType()) && + hlfir::mayHaveAllocatableComponent(addr.getType()); }; if (needInitClone()) { diff --git a/flang/runtime/derived.cpp b/flang/runtime/derived.cpp index 7c164ff89045..10813c62e5da 100644 --- a/flang/runtime/derived.cpp +++ b/flang/runtime/derived.cpp @@ -129,6 +129,10 @@ RT_API_ATTRS int InitializeClone(const Descriptor &clone, std::size_t elements{orig.Elements()}; int stat{StatOk}; + // Skip pointers and unallocated variables. + if (orig.IsPointer() || !orig.IsAllocated()) { + return stat; + } // Initialize each data component. std::size_t components{componentDesc.Elements()}; for (std::size_t i{0}; i < components; ++i) { diff --git a/flang/test/Lower/OpenMP/derived-type-allocatable.f90 b/flang/test/Lower/OpenMP/derived-type-allocatable.f90 index d265954ef1ce..2dc4e20f27af 100644 --- a/flang/test/Lower/OpenMP/derived-type-allocatable.f90 +++ b/flang/test/Lower/OpenMP/derived-type-allocatable.f90 @@ -13,6 +13,10 @@ module m1 contains +!CHECK-LABEL: omp.private {type = private} @_QMm1Ftest_pointer +!CHECK-NOT: fir.call @_FortranAInitializeClone +!CHECK: omp.yield + !CHECK-LABEL: omp.private {type = private} @_QMm1Ftest_nested !CHECK: fir.call @_FortranAInitializeClone !CHECK-NEXT: omp.yield @@ -91,4 +95,11 @@ contains !$omp parallel private(d2) !$omp end parallel end subroutine + + subroutine test_pointer() + type(x), pointer :: ptr + + !$omp parallel private(ptr) + !$omp end parallel + end subroutine end module