Skip to content

Commit 567883d

Browse files
committed
do not default initialize OMP variables twice
1 parent cb3e976 commit 567883d

File tree

6 files changed

+39
-17
lines changed

6 files changed

+39
-17
lines changed

flang/include/flang/Lower/AbstractConverter.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,11 @@ class AbstractConverter {
118118

119119
/// For a given symbol which is host-associated, create a clone using
120120
/// parameters from the host-associated symbol.
121+
/// The clone is default initialized if its type has any default
122+
/// initialization unless `skipDefaultInit` is set.
121123
virtual bool
122-
createHostAssociateVarClone(const Fortran::semantics::Symbol &sym) = 0;
124+
createHostAssociateVarClone(const Fortran::semantics::Symbol &sym,
125+
bool skipDefaultInit) = 0;
123126

124127
virtual void
125128
createHostAssociateVarCloneDealloc(const Fortran::semantics::Symbol &sym) = 0;

flang/lib/Lower/Bridge.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -710,8 +710,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
710710
return bool(shallowLookupSymbol(sym));
711711
}
712712

713-
bool createHostAssociateVarClone(
714-
const Fortran::semantics::Symbol &sym) override final {
713+
bool createHostAssociateVarClone(const Fortran::semantics::Symbol &sym,
714+
bool skipDefaultInit) override final {
715715
mlir::Location loc = genLocation(sym.name());
716716
mlir::Type symType = genType(sym);
717717
const auto *details = sym.detailsIf<Fortran::semantics::HostAssocDetails>();
@@ -830,6 +830,8 @@ class FirConverter : public Fortran::lower::AbstractConverter {
830830
if_builder.end();
831831
},
832832
[&](const auto &) -> void {
833+
if (skipDefaultInit)
834+
return;
833835
// Initialize local/private derived types with default
834836
// initialization (Fortran 2023 section 11.1.7.5 and OpenMP 5.2
835837
// section 5.3). Pointer and allocatable components, when allowed,
@@ -1986,9 +1988,9 @@ class FirConverter : public Fortran::lower::AbstractConverter {
19861988
Fortran::semantics::SemanticsContext &semanticsContext =
19871989
bridge.getSemanticsContext();
19881990
for (const Fortran::semantics::Symbol *sym : info.localSymList)
1989-
createHostAssociateVarClone(*sym);
1991+
createHostAssociateVarClone(*sym, /*skipDefaultInit=*/false);
19901992
for (const Fortran::semantics::Symbol *sym : info.localInitSymList) {
1991-
createHostAssociateVarClone(*sym);
1993+
createHostAssociateVarClone(*sym, /*skipDefaultInit=*/true);
19921994
const auto *hostDetails =
19931995
sym->detailsIf<Fortran::semantics::HostAssocDetails>();
19941996
assert(hostDetails && "missing locality spec host symbol");

flang/lib/Lower/OpenMP/DataSharingProcessor.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,11 @@ void DataSharingProcessor::insertDeallocs() {
111111
}
112112

113113
void DataSharingProcessor::cloneSymbol(const semantics::Symbol *sym) {
114-
bool success = converter.createHostAssociateVarClone(*sym);
114+
bool isFirstPrivate = sym->test(semantics::Symbol::Flag::OmpFirstPrivate);
115+
bool success = converter.createHostAssociateVarClone(
116+
*sym, /*skipDefaultInit=*/isFirstPrivate);
115117
(void)success;
116118
assert(success && "Privatization failed due to existing binding");
117-
118-
bool isFirstPrivate = sym->test(semantics::Symbol::Flag::OmpFirstPrivate);
119-
if (!isFirstPrivate &&
120-
Fortran::lower::hasDefaultInitialization(sym->GetUltimate()))
121-
Fortran::lower::defaultInitializeAtRuntime(converter, *sym, *symTable);
122119
}
123120

124121
void DataSharingProcessor::copyFirstPrivateSymbol(

flang/test/Lower/OpenMP/delayed-privatization-default-init.f90

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@
66
! RUN: FileCheck %s
77

88
subroutine delayed_privatization_default_init
9+
implicit none
10+
type t
11+
integer :: i = 2
12+
end type
13+
integer :: i, res(4)
14+
type(t) :: a
15+
!$omp parallel private(a)
16+
call do_something(a%i)
17+
!$omp end parallel
18+
end subroutine
19+
20+
subroutine delayed_privatization_default_init_firstprivate
921
implicit none
1022
type t
1123
integer :: i = 2
@@ -16,12 +28,20 @@ subroutine delayed_privatization_default_init
1628
call do_something(a%i)
1729
!$omp end parallel
1830
end subroutine
19-
! CHECK-LABEL: omp.private {type = firstprivate} @_QFdelayed_privatization_default_initEa_firstprivate_ref_rec__QFdelayed_privatization_default_initTt : !fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>> alloc {
31+
32+
! CHECK-LABEL: omp.private {type = firstprivate} @_QFdelayed_privatization_default_init_firstprivateEa_firstprivate_ref_rec__QFdelayed_privatization_default_init_firstprivateTt : !fir.ref<!fir.type<_QFdelayed_privatization_default_init_firstprivateTt{i:i32}>> alloc {
33+
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.type<_QFdelayed_privatization_default_init_firstprivateTt{i:i32}>>):
34+
! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QFdelayed_privatization_default_init_firstprivateTt{i:i32}> {bindc_name = "a", pinned, uniq_name = "_QFdelayed_privatization_default_init_firstprivateEa"}
35+
! CHECK-NEXT: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFdelayed_privatization_default_init_firstprivateEa"} : (!fir.ref<!fir.type<_QFdelayed_privatization_default_init_firstprivateTt{i:i32}>>) -> (!fir.ref<!fir.type<_QFdelayed_privatization_default_init_firstprivateTt{i:i32}>>, !fir.ref<!fir.type<_QFdelayed_privatization_default_init_firstprivateTt{i:i32}>>)
36+
! CHECK: omp.yield(%[[VAL_9]]#0 : !fir.ref<!fir.type<_QFdelayed_privatization_default_init_firstprivateTt{i:i32}>>)
37+
! CHECK: }
38+
39+
! CHECK-LABEL: omp.private {type = private} @_QFdelayed_privatization_default_initEa_private_ref_rec__QFdelayed_privatization_default_initTt : !fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>> alloc {
2040
! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>):
2141
! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QFdelayed_privatization_default_initTt{i:i32}> {bindc_name = "a", pinned, uniq_name = "_QFdelayed_privatization_default_initEa"}
2242
! CHECK: %[[VAL_2:.*]] = fir.embox %[[VAL_1]] : (!fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>) -> !fir.box<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>
2343
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_2]] : (!fir.box<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>) -> !fir.box<none>
2444
! CHECK: %[[VAL_8:.*]] = fir.call @_FortranAInitialize(%[[VAL_6]],{{.*}}
25-
! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFdelayed_privatization_default_initEa"} : (!fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>) -> (!fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>, !fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>)
45+
! CHECK-NEXT: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFdelayed_privatization_default_initEa"} : (!fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>) -> (!fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>, !fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>)
2646
! CHECK: omp.yield(%[[VAL_9]]#0 : !fir.ref<!fir.type<_QFdelayed_privatization_default_initTt{i:i32}>>)
2747
! CHECK: }

flang/test/Lower/OpenMP/private-derived-type.f90

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ end subroutine s4
2828
! CHECK: %[[VAL_15:.*]] = fir.call @_FortranAInitialize(%[[VAL_13]], %[[VAL_14]], %[[VAL_12]]) fastmath<contract> : (!fir.box<none>, !fir.ref<i8>, i32) -> none
2929
! CHECK: omp.parallel {
3030
! CHECK: %[[VAL_23:.*]] = fir.alloca !fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}> {bindc_name = "v", pinned, uniq_name = "_QFs4Ev"}
31-
! CHECK: %[[VAL_24:.*]]:2 = hlfir.declare %[[VAL_23]] {uniq_name = "_QFs4Ev"} : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>, !fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>)
32-
! CHECK: %[[VAL_25:.*]] = fir.embox %[[VAL_24]]#1 : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>
31+
! CHECK: %[[VAL_25:.*]] = fir.embox %[[VAL_23]] : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>
3332
! CHECK: %[[VAL_26:.*]] = fir.address_of
34-
! CHECK: %[[VAL_27:.*]] = arith.constant 4 : i32
33+
! CHECK: %[[VAL_27:.*]] = arith.constant 8 : i32
3534
! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_25]] : (!fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<none>
3635
! CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_26]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
3736
! Check we do call FortranAInitialize on the derived type
3837
! CHECK: %[[VAL_30:.*]] = fir.call @_FortranAInitialize(%[[VAL_28]], %[[VAL_29]], %[[VAL_27]]) fastmath<contract> : (!fir.box<none>, !fir.ref<i8>, i32) -> none
38+
! CHECK: %[[VAL_24:.*]]:2 = hlfir.declare %[[VAL_23]] {uniq_name = "_QFs4Ev"} : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>, !fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>)
3939
! CHECK: omp.wsloop {
4040
! CHECK: }
4141
! CHECK: %[[VAL_39:.*]] = fir.embox %[[VAL_9]]#1 : (!fir.ref<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>) -> !fir.box<!fir.type<_QFs4Ty3{x:!fir.box<!fir.heap<i32>>}>>

flang/test/Lower/do_concurrent_local_default_init.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ subroutine test_default_init()
2121
integer :: i, res(4)
2222
type(t) :: a
2323
do concurrent (i=1:4) local(a)
24-
res = a%i
24+
res(i) = a%i
2525
end do
2626
call something(res)
2727
end subroutine

0 commit comments

Comments
 (0)