[flang-commits] [flang] d82d53b - [flang][openmp] initialize allocatable components of firstprivate copies (#121808)
via flang-commits
flang-commits at lists.llvm.org
Tue Jan 7 01:04:31 PST 2025
Author: jeanPerier
Date: 2025-01-07T10:04:27+01:00
New Revision: d82d53b2e3d7fb2f44f91dc1ca9ce8bb5487da57
URL: https://github.com/llvm/llvm-project/commit/d82d53b2e3d7fb2f44f91dc1ca9ce8bb5487da57
DIFF: https://github.com/llvm/llvm-project/commit/d82d53b2e3d7fb2f44f91dc1ca9ce8bb5487da57.diff
LOG: [flang][openmp] initialize allocatable components of firstprivate copies (#121808)
Descriptors of allocatable components of firstprivate derived type
copies need to be set-up. Otherwise the program later die when
manipulating them inside OpenMP region.
Added:
flang/test/Lower/OpenMP/firstprivate-alloc-comp.f90
Modified:
flang/lib/Lower/Bridge.cpp
Removed:
################################################################################
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index c7bf4248155483..37f51d74d23f8f 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -833,7 +833,11 @@ class FirConverter : public Fortran::lower::AbstractConverter {
if_builder.end();
},
[&](const auto &) -> void {
- if (skipDefaultInit)
+ // Always initialize allocatable component descriptor, even when the
+ // value is later copied from the host (e.g. firstprivate) because the
+ // assignment from the host to the copy will fail if the component
+ // descriptors are not initialized.
+ if (skipDefaultInit && !hlfir::mayHaveAllocatableComponent(hSymType))
return;
// Initialize local/private derived types with default
// initialization (Fortran 2023 section 11.1.7.5 and OpenMP 5.2
diff --git a/flang/test/Lower/OpenMP/firstprivate-alloc-comp.f90 b/flang/test/Lower/OpenMP/firstprivate-alloc-comp.f90
new file mode 100644
index 00000000000000..2453fe2c5208bc
--- /dev/null
+++ b/flang/test/Lower/OpenMP/firstprivate-alloc-comp.f90
@@ -0,0 +1,19 @@
+! Test delayed privatization for derived types with allocatable components.
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s | FileCheck %s
+
+subroutine firstprivate_alloc_comp
+ type t1
+ integer, allocatable :: c(:)
+ end type
+ type(t1) :: x
+ !$omp parallel firstprivate(x)
+ print *, allocated(x%c)
+ !$omp end parallel
+end
+
+ call firstprivate_alloc_comp()
+end
+! CHECK-LABEL: omp.private {type = firstprivate} @_QFfirstprivate_alloc_compEx_firstprivate_ref_rec__QFfirstprivate_alloc_compTt1 : !fir.ref<!fir.type<_QFfirstprivate_alloc_compTt1{c:!fir.box<!fir.heap<!fir.array<?xi32>>>}>> alloc {
+! CHECK: fir.call @_FortranAInitialize(
+! CHECK: } copy {
+! ...
More information about the flang-commits
mailing list