Skip to content

Commit 091dcb8

Browse files
[Flang] Make a private copy for the common block variables in copyin clause (#111359)
Fixes: #82949
1 parent 2de7b6c commit 091dcb8

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

flang/lib/Lower/Bridge.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -948,13 +948,20 @@ class FirConverter : public Fortran::lower::AbstractConverter {
948948
std::function<void(const Fortran::semantics::Symbol &, bool)>
949949
insertSymbols = [&](const Fortran::semantics::Symbol &oriSymbol,
950950
bool collectSymbol) {
951-
if (collectSymbol && oriSymbol.test(flag))
951+
if (collectSymbol && oriSymbol.test(flag)) {
952952
symbolSet.insert(&oriSymbol);
953-
else if (checkHostAssociatedSymbols)
953+
} else if (const auto *commonDetails =
954+
oriSymbol.detailsIf<
955+
Fortran::semantics::CommonBlockDetails>()) {
956+
for (const auto &mem : commonDetails->objects())
957+
if (collectSymbol && mem->test(flag))
958+
symbolSet.insert(&(*mem).GetUltimate());
959+
} else if (checkHostAssociatedSymbols) {
954960
if (const auto *details{
955961
oriSymbol
956962
.detailsIf<Fortran::semantics::HostAssocDetails>()})
957963
insertSymbols(details->symbol(), true);
964+
}
958965
};
959966
insertSymbols(sym, collectSymbols);
960967
};

flang/test/Lower/OpenMP/copyin.f90

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,48 @@ subroutine allocatable2()
480480
!$omp end parallel
481481
end subroutine
482482

483+
! CHECK-LABEL: func.func @_QPcommon_3() {
484+
! [...]
485+
! CHECK: omp.parallel {
486+
! CHECK: %[[VAL_22:.*]] = omp.threadprivate %[[VAL_0:.*]] : !fir.ref<!fir.array<32xi8>> -> !fir.ref<!fir.array<32xi8>>
487+
! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_22:.*]] : (!fir.ref<!fir.array<32xi8>>) -> !fir.ref<!fir.array<?xi8>>
488+
! CHECK: %[[VAL_24:.*]] = arith.constant 0 : index
489+
! CHECK: %[[VAL_25:.*]] = fir.coordinate_of %[[VAL_23:.*]], %[[VAL_24:.*]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
490+
! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25:.*]] : (!fir.ref<i8>) -> !fir.ref<i32>
491+
! CHECK: %[[VAL_27:.*]]:2 = hlfir.declare %[[VAL_26:.*]] {uniq_name = "_QFcommon_3Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
492+
! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_22:.*]] : (!fir.ref<!fir.array<32xi8>>) -> !fir.ref<!fir.array<?xi8>>
493+
! CHECK: %[[VAL_29:.*]] = arith.constant 4 : index
494+
! CHECK: %[[VAL_30:.*]] = fir.coordinate_of %[[VAL_28:.*]], %[[VAL_29:.*]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
495+
! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_30:.*]] : (!fir.ref<i8>) -> !fir.ref<i32>
496+
! CHECK: %[[VAL_32:.*]]:2 = hlfir.declare %[[VAL_31:.*]] {uniq_name = "_QFcommon_3Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
497+
! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_22:.*]] : (!fir.ref<!fir.array<32xi8>>) -> !fir.ref<!fir.array<?xi8>>
498+
! CHECK: %[[VAL_34:.*]] = arith.constant 8 : index
499+
! CHECK: %[[VAL_35:.*]] = fir.coordinate_of %[[VAL_33:.*]], %[[VAL_34:.*]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
500+
! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_35:.*]] : (!fir.ref<i8>) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
501+
! CHECK: %[[VAL_37:.*]]:2 = hlfir.declare %[[VAL_36:.*]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFcommon_3Earr"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
502+
! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_16:.*]]#0 : !fir.ref<i32>
503+
! CHECK: hlfir.assign %[[VAL_38:.*]] to %[[VAL_27:.*]]#0 : i32, !fir.ref<i32>
504+
! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_21:.*]]#0 : !fir.ref<i32>
505+
! CHECK: hlfir.assign %[[VAL_39:.*]] to %[[VAL_32:.*]]#0 : i32, !fir.ref<i32>
506+
! CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_11:.*]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
507+
! CHECK: fir.store %[[VAL_40:.*]] to %[[VAL_37:.*]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
508+
! CHECK: omp.barrier
509+
! CHECK: omp.terminator
510+
! CHECK: }
511+
! CHECK: return
512+
! CHECK: }
513+
514+
subroutine common_3()
515+
integer :: x, y
516+
integer, pointer :: arr
517+
common /c3/ x, y, arr
518+
!$omp threadprivate(/c3/)
519+
520+
!$omp parallel copyin(/c3/)
521+
call sub_3()
522+
!$omp end parallel
523+
end subroutine
524+
483525
! CHECK: func.func @_QPallocatable3() {
484526
! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QFallocatable3Ea) : !fir.ref<!fir.box<!fir.heap<i32>>>
485527
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFallocatable3Ea"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)

0 commit comments

Comments
 (0)