Skip to content

Commit f752265

Browse files
committed
[flang][OpenMP] Support for privatization in common block
This patch provides support for usage of common block in private/firstprivate and lastprivate clauses. Reviewed By: kiranchandramohan Differential Revision: https://reviews.llvm.org/D156120
1 parent 171868d commit f752265

File tree

6 files changed

+88
-39
lines changed

6 files changed

+88
-39
lines changed

flang/lib/Lower/Bridge.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -564,18 +564,6 @@ 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) {
579567
mlir::Location loc = genLocation(sym.name());
580568
mlir::Type symType = genType(sym);
581569
const auto *details = sym.detailsIf<Fortran::semantics::HostAssocDetails>();

flang/lib/Lower/OpenMP.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -413,15 +413,30 @@ void DataSharingProcessor::collectDefaultSymbols() {
413413

414414
void DataSharingProcessor::privatize() {
415415
for (const Fortran::semantics::Symbol *sym : privatizedSymbols) {
416-
cloneSymbol(sym);
417-
copyFirstPrivateSymbol(sym);
416+
if (const auto *commonDet =
417+
sym->detailsIf<Fortran::semantics::CommonBlockDetails>()) {
418+
for (const auto mem : commonDet->objects()) {
419+
cloneSymbol(&*mem);
420+
copyFirstPrivateSymbol(&*mem);
421+
}
422+
} else {
423+
cloneSymbol(sym);
424+
copyFirstPrivateSymbol(sym);
425+
}
418426
}
419427
}
420428

421429
void DataSharingProcessor::copyLastPrivatize(mlir::Operation *op) {
422430
insertLastPrivateCompare(op);
423431
for (const Fortran::semantics::Symbol *sym : privatizedSymbols)
424-
copyLastPrivateSymbol(sym, &lastPrivIP);
432+
if (const auto *commonDet =
433+
sym->detailsIf<Fortran::semantics::CommonBlockDetails>()) {
434+
for (const auto mem : commonDet->objects()) {
435+
copyLastPrivateSymbol(&*mem, &lastPrivIP);
436+
}
437+
} else {
438+
copyLastPrivateSymbol(sym, &lastPrivIP);
439+
}
425440
}
426441

427442
void DataSharingProcessor::defaultPrivatize() {

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

Lines changed: 0 additions & 11 deletions
This file was deleted.

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

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
! RUN: %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
2+
3+
!CHECK: func.func @_QPfirstprivate_common() {
4+
!CHECK: %[[val_0:.*]] = fir.address_of(@_QCc) : !fir.ref<!fir.array<8xi8>>
5+
!CHECK: %[[val_1:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
6+
!CHECK: %[[val_c0:.*]] = arith.constant 0 : index
7+
!CHECK: %[[val_2:.*]] = fir.coordinate_of %[[val_1]], %[[val_c0]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
8+
!CHECK: %[[val_3:.*]] = fir.convert %[[val_2]] : (!fir.ref<i8>) -> !fir.ref<f32>
9+
!CHECK: %[[val_4:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
10+
!CHECK: %[[val_c4:.*]] = arith.constant 4 : index
11+
!CHECK: %[[val_5:.*]] = fir.coordinate_of %[[val_4]], %[[val_c4]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
12+
!CHECK: %[[val_6:.*]] = fir.convert %[[val_5]] : (!fir.ref<i8>) -> !fir.ref<f32>
13+
!CHECK: omp.parallel {
14+
!CHECK: %[[val_7:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFfirstprivate_commonEx"}
15+
!CHECK: %[[val_8:.*]] = fir.load %[[val_3]] : !fir.ref<f32>
16+
!CHECK: fir.store %[[val_8]] to %[[val_7]] : !fir.ref<f32>
17+
!CHECK: %[[val_9:.*]] = fir.alloca f32 {bindc_name = "y", pinned, uniq_name = "_QFfirstprivate_commonEy"}
18+
!CHECK: %[[val_10:.*]] = fir.load %[[val_6]] : !fir.ref<f32>
19+
!CHECK: fir.store %[[val_10]] to %[[val_9]] : !fir.ref<f32>
20+
!CHECK: omp.terminator
21+
!CHECK: }
22+
!CHECK: return
23+
!CHECK: }
24+
25+
subroutine firstprivate_common
26+
common /c/ x, y
27+
real x, y
28+
!$omp parallel firstprivate(/c/)
29+
!$omp end parallel
30+
end subroutine
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
! RUN: %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
2+
3+
!CHECK: func.func @_QPlastprivate_common() {
4+
!CHECK: %[[val_0:.*]] = fir.alloca i32 {adapt.valuebyref}
5+
!CHECK: %[[val_1:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFlastprivate_commonEi"}
6+
!CHECK: %[[val_2:.*]] = fir.address_of(@_QCc) : !fir.ref<!fir.array<8xi8>>
7+
!CHECK: %[[val_3:.*]] = fir.convert %[[val_2]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
8+
!CHECK: %[[val_c0:.*]] = arith.constant 0 : index
9+
!CHECK: %[[val_4:.*]] = fir.coordinate_of %[[val_3]], %[[val_c0]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
10+
!CHECK: %[[val_5:.*]] = fir.convert %[[val_4]] : (!fir.ref<i8>) -> !fir.ref<f32>
11+
!CHECK: %[[val_6:.*]] = fir.convert %[[val_2]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
12+
!CHECK: %[[val_c4:.*]] = arith.constant 4 : index
13+
!CHECK: %[[val_7:.*]] = fir.coordinate_of %[[val_6]], %[[val_c4]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
14+
!CHECK: %[[val_8:.*]] = fir.convert %[[val_7]] : (!fir.ref<i8>) -> !fir.ref<f32>
15+
!CHECK: %[[val_9:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFlastprivate_commonEx"}
16+
!CHECK: %[[val_10:.*]] = fir.alloca f32 {bindc_name = "y", pinned, uniq_name = "_QFlastprivate_commonEy"}
17+
!CHECK: %[[val_c1_i32:.*]] = arith.constant 1 : i32
18+
!CHECK: %[[val_c100_i32:.*]] = arith.constant 100 : i32
19+
!CHECK: %[[val_c1_i32_0:.*]] = arith.constant 1 : i32
20+
!CHECK: omp.wsloop for (%[[arg:.*]]) : i32 = (%[[val_c1_i32]]) to (%[[val_c100_i32]]) inclusive step (%[[val_c1_i32_0]]) {
21+
!CHECK: fir.store %[[arg]] to %[[val_0]] : !fir.ref<i32>
22+
!CHECK: %[[val_11:.*]] = arith.cmpi eq, %[[arg]], %[[val_c100_i32]] : i32
23+
!CHECK: fir.if %[[val_11]] {
24+
!CHECK: %[[val_12:.*]] = fir.load %[[val_9]] : !fir.ref<f32>
25+
!CHECK: fir.store %[[val_12]] to %[[val_5]] : !fir.ref<f32>
26+
!CHECK: %[[val_13:.*]] = fir.load %[[val_10]] : !fir.ref<f32>
27+
!CHECK: fir.store %[[val_13]] to %[[val_8]] : !fir.ref<f32>
28+
!CHECK: }
29+
!CHECK: omp.yield
30+
!CHECK: }
31+
!CHECK: return
32+
!CHECK: }
33+
subroutine lastprivate_common
34+
common /c/ x, y
35+
real x, y
36+
!$omp do lastprivate(/c/)
37+
do i=1,100
38+
end do
39+
!$omp end do
40+
end subroutine

0 commit comments

Comments
 (0)