Skip to content

Commit b4c54b2

Browse files
PeixinQiaoNimishMishra
authored andcommitted
[flang][OpenMP] Support common block in OpenMP private clause
This supports the common block in OpenMP privat clause by making each common block member host-associated privatization and adds the test case. Reviewed By: kiranchandramohan Differential Revision: https://reviews.llvm.org/D127215
1 parent c1c86f9 commit b4c54b2

File tree

6 files changed

+126
-16
lines changed

6 files changed

+126
-16
lines changed

flang/lib/Lower/Bridge.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,18 @@ class FirConverter : public Fortran::lower::AbstractConverter {
564564

565565
bool createHostAssociateVarClone(
566566
const Fortran::semantics::Symbol &sym) override final {
567+
bool success{false};
568+
if (const auto *commonDet =
569+
sym.detailsIf<Fortran::semantics::CommonBlockDetails>()) {
570+
for (const auto &mem : commonDet->objects())
571+
success = genHostAssociateVarClone(*mem);
572+
} else {
573+
success = genHostAssociateVarClone(sym);
574+
}
575+
return success;
576+
}
577+
578+
bool genHostAssociateVarClone(const Fortran::semantics::Symbol &sym) {
567579
mlir::Location loc = genLocation(sym.name());
568580
mlir::Type symType = genType(sym);
569581
const auto *details = sym.detailsIf<Fortran::semantics::HostAssocDetails>();

flang/lib/Lower/OpenMP.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,12 +236,6 @@ void DataSharingProcessor::collectSymbolsForPrivatization() {
236236
}
237237
}
238238

239-
for (const Fortran::semantics::Symbol *ps : privatizedSymbols) {
240-
if (ps->has<Fortran::semantics::CommonBlockDetails>())
241-
TODO(converter.getCurrentLocation(),
242-
"Common Block in privatization clause");
243-
}
244-
245239
if (hasCollapse && hasLastPrivateOp)
246240
TODO(converter.getCurrentLocation(), "Collapse clause with lastprivate");
247241
}

flang/test/Lower/OpenMP/Todo/firstprivate-commonblock.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
22
! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
3+
! XFAIL: *
34

45
! CHECK: not yet implemented: Common Block in privatization clause
56
subroutine firstprivate_common

flang/test/Lower/OpenMP/Todo/lastprivate-commonblock.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
22
! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
3+
! XFAIL: *
34

45
! CHECK: not yet implemented: Common Block in privatization clause
56
subroutine lastprivate_common

flang/test/Lower/OpenMP/Todo/private-commonblock.f90

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
! RUN: %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
2+
3+
!CHECK: func.func @_QPprivate_common() {
4+
!CHECK: omp.parallel {
5+
!CHECK: %[[X:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFprivate_commonEx"}
6+
!CHECK: %[[Y:.*]] = fir.alloca f32 {bindc_name = "y", pinned, uniq_name = "_QFprivate_commonEy"}
7+
!CHECK: omp.terminator
8+
!CHECK: }
9+
!CHECK: return
10+
!CHECK: }
11+
subroutine private_common
12+
common /c/ x, y
13+
real x, y
14+
!$omp parallel private(/c/)
15+
!$omp end parallel
16+
end subroutine
17+
18+
!CHECK: %[[val_0:.*]] = fir.address_of(@_QCblk) : !fir.ref<!fir.array<74xi8>>
19+
!CHECK: %[[val_1:.*]] = fir.convert %0 : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
20+
!CHECK: %[[val_c0:.*]] = arith.constant 0 : index
21+
!CHECK: %[[val_2:.*]] = fir.coordinate_of %[[val_1]], %[[val_c0]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
22+
!CHECK: %[[val_3:.*]] = fir.convert %[[val_2]] : (!fir.ref<i8>) -> !fir.ref<i32>
23+
!CHECK: %[[val_4:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
24+
!CHECK: %[[val_c4:.*]] = arith.constant 4 : index
25+
!CHECK: %[[val_5:.*]] = fir.coordinate_of %[[val_4]], %[[val_c4]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
26+
!CHECK: %[[val_6:.*]] = fir.convert %[[val_5]] : (!fir.ref<i8>) -> !fir.ref<!fir.array<10xf32>>
27+
!CHECK: %[[val_7:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
28+
!CHECK: %[[val_c44:.*]] = arith.constant 44 : index
29+
!CHECK: %[[val_8:.*]] = fir.coordinate_of %[[val_7]], %[[val_c44]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
30+
!CHECK: %[[val_9:.*]] = fir.convert %[[val_8]] : (!fir.ref<i8>) -> !fir.ref<!fir.char<1,5>>
31+
!CHECK: %[[val_c5:.*]] = arith.constant 5 : index
32+
!CHECK: %[[val_10:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
33+
!CHECK: %[[val_c49:.*]] = arith.constant 49 : index
34+
!CHECK: %[[val_11:.*]] = fir.coordinate_of %[[val_10]], %[[val_c49]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
35+
!CHECK: %[[val_12:.*]] = fir.convert %[[val_11]] : (!fir.ref<i8>) -> !fir.ref<!fir.array<5x!fir.char<1,5>>>
36+
!CHECK: %[[val_c5_0:.*]] = arith.constant 5 : index
37+
!CHECK: %[[val_13:.*]] = fir.convert %[[val_9]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<!fir.char<1,?>>
38+
!CHECK: %[[val_14:.*]] = fir.emboxchar %[[val_13]], %[[val_c5]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
39+
!CHECK: %[[val_15:.*]] = fir.convert %[[val_12]] : (!fir.ref<!fir.array<5x!fir.char<1,5>>>) -> !fir.ref<!fir.char<1,?>>
40+
!CHECK: %[[val_16:.*]] = fir.emboxchar %[[val_15]], %[[val_c5_0]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
41+
!CHECK: fir.call @_QPsub1(%[[val_3]], %[[val_6]], %[[val_14]], %[[val_16]]) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.array<10xf32>>, !fir.boxchar<1>, !fir.boxchar<1>) -> ()
42+
!CHECK: omp.parallel {
43+
!CHECK: %[[val_21:.*]] = fir.alloca i32 {bindc_name = "a", pinned, uniq_name = "_QFprivate_clause_commonblockEa"}
44+
!CHECK: %[[val_22:.*]] = fir.alloca !fir.array<10xf32> {bindc_name = "b", pinned, uniq_name = "_QFprivate_clause_commonblockEb"}
45+
!CHECK: %[[val_23:.*]] = fir.alloca !fir.char<1,5> {bindc_name = "c", pinned, uniq_name = "_QFprivate_clause_commonblockEc"}
46+
!CHECK: %[[val_24:.*]] = fir.alloca !fir.array<5x!fir.char<1,5>> {bindc_name = "d", pinned, uniq_name = "_QFprivate_clause_commonblockEd"}
47+
!CHECK: %[[val_25:.*]] = fir.convert %[[val_23]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<!fir.char<1,?>>
48+
!CHECK: %[[val_26:.*]] = fir.emboxchar %[[val_25]], %[[val_c5]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
49+
!CHECK: %[[val_27:.*]] = fir.convert %[[val_24]] : (!fir.ref<!fir.array<5x!fir.char<1,5>>>) -> !fir.ref<!fir.char<1,?>>
50+
!CHECK: %[[val_28:.*]] = fir.emboxchar %[[val_27]], %[[val_c5_0]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
51+
!CHECK: fir.call @_QPsub2(%[[val_21]], %[[val_22]], %[[val_26]], %[[val_28]]) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.array<10xf32>>, !fir.boxchar<1>, !fir.boxchar<1>) -> ()
52+
!CHECK: omp.terminator
53+
!CHECK: }
54+
!CHECK: %[[val_17:.*]] = fir.convert %[[val_9]] : (!fir.ref<!fir.char<1,5>>) -> !fir.ref<!fir.char<1,?>>
55+
!CHECK: %[[val_18:.*]] = fir.emboxchar %[[val_17]], %[[val_c5]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
56+
!CHECK: %[[val_19:.*]] = fir.convert %[[val_12]] : (!fir.ref<!fir.array<5x!fir.char<1,5>>>) -> !fir.ref<!fir.char<1,?>>
57+
!CHECK: %[[val_20:.*]] = fir.emboxchar %[[val_19]], %[[val_c5_0]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
58+
!CHECK: fir.call @_QPsub3(%[[val_3]], %[[val_6]], %[[val_18]], %[[val_20]]) fastmath<contract> : {{.*}}
59+
!CHECK: return
60+
!CHECK: }
61+
subroutine private_clause_commonblock()
62+
integer::a
63+
real::b(10)
64+
character(5):: c, d(5)
65+
common /blk/ a, b, c, d
66+
67+
call sub1(a, b, c, d)
68+
!$omp parallel private(/blk/)
69+
call sub2(a, b, c, d)
70+
!$omp end parallel
71+
call sub3(a, b, c, d)
72+
end subroutine
73+
74+
!CHECK: func.func @_QPprivate_clause_commonblock_pointer() {
75+
!CHECK: %[[val_0:.*]] = fir.address_of(@_QCblk) : !fir.ref<!fir.array<74xi8>>
76+
!CHECK: %[[val_1:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
77+
!CHECK: %[[val_c24:.*]] = arith.constant 24 : index
78+
!CHECK: %[[val_2:.*]] = fir.coordinate_of %[[val_1]], %[[val_c24]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
79+
!CHECK: %[[val_3:.*]] = fir.convert %[[val_2]] : (!fir.ref<i8>) -> !fir.ref<i32>
80+
!CHECK: %[[val_4:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
81+
!CHECK: %[[val_c0:.*]] = arith.constant 0 : index
82+
!CHECK: %[[val_5:.*]] = fir.coordinate_of %[[val_4]], %[[val_c0]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
83+
!CHECK: %[[val_6:.*]] = fir.convert %[[val_5]] : (!fir.ref<i8>) -> !fir.ref<!fir.box<!fir.ptr<!fir.complex<4>>>>
84+
!CHECK: %[[val_7:.*]] = fir.load %[[val_6]] : !fir.ref<!fir.box<!fir.ptr<!fir.complex<4>>>>
85+
!CHECK: %[[val_8:.*]] = fir.box_addr %[[val_7]] : (!fir.box<!fir.ptr<!fir.complex<4>>>) -> !fir.ptr<!fir.complex<4>>
86+
!CHECK: %[[val_9:.*]] = fir.convert %[[val_8]] : (!fir.ptr<!fir.complex<4>>) -> !fir.ref<!fir.complex<4>>
87+
!CHECK: fir.call @_QPsub4(%[[val_9]], %[[val_3]]) fastmath<contract> : (!fir.ref<!fir.complex<4>>, !fir.ref<i32>) -> ()
88+
!CHECK: omp.parallel {
89+
!CHECK: %[[val_13:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.complex<4>>> {bindc_name = "c", pinned, uniq_name = "_QFprivate_clause_commonblock_pointerEc"}
90+
!CHECK: %[[val_14:.*]] = fir.alloca i32 {bindc_name = "a", pinned, uniq_name = "_QFprivate_clause_commonblock_pointerEa"}
91+
!CHECK: %[[val_15:.*]] = fir.load %[[val_13]] : !fir.ref<!fir.box<!fir.ptr<!fir.complex<4>>>>
92+
!CHECK: %[[val_16:.*]] = fir.box_addr %[[val_15]] : (!fir.box<!fir.ptr<!fir.complex<4>>>) -> !fir.ptr<!fir.complex<4>>
93+
!CHECK: %[[val_17:.*]] = fir.convert %[[val_16]] : (!fir.ptr<!fir.complex<4>>) -> !fir.ref<!fir.complex<4>>
94+
!CHECK: fir.call @_QPsub5(%[[val_17]], %[[val_14]]) fastmath<contract> : (!fir.ref<!fir.complex<4>>, !fir.ref<i32>) -> ()
95+
!CHECK: omp.terminator
96+
!CHECK: }
97+
!CHECK: %[[val_10:.*]] = fir.load %[[val_6]] : !fir.ref<!fir.box<!fir.ptr<!fir.complex<4>>>>
98+
!CHECK: %[[val_11:.*]] = fir.box_addr %[[val_10]] : (!fir.box<!fir.ptr<!fir.complex<4>>>) -> !fir.ptr<!fir.complex<4>>
99+
!CHECK: %[[val_12:.*]] = fir.convert %[[val_11]] : (!fir.ptr<!fir.complex<4>>) -> !fir.ref<!fir.complex<4>>
100+
!CHECK: fir.call @_QPsub6(%[[val_12]], %[[val_3]]) fastmath<contract> : (!fir.ref<!fir.complex<4>>, !fir.ref<i32>) -> ()
101+
!CHECK: return
102+
!CHECK: }
103+
subroutine private_clause_commonblock_pointer()
104+
complex, pointer :: c
105+
integer:: a
106+
common /blk/ c, a
107+
call sub4(c, a)
108+
!$omp parallel private(/blk/)
109+
call sub5(c, a)
110+
!$omp end parallel
111+
call sub6(c, a)
112+
end subroutine

0 commit comments

Comments
 (0)