Skip to content

Commit c8bf447

Browse files
committed
[Flang][OpenMP] NFC: Share DataSharingProcessor creation logic for all loop directives
This patch moves the logic associated with the creation of a `DataSharingProcessor` instance for loop-associated OpenMP leaf constructs to the `genOMPDispatch` function, avoiding code duplication for standalone and composite loop constructs. This also prevents privatization-related allocations to be later made inside of loop wrappers when support for composite constructs is implemented.
1 parent 2d0c4c3 commit c8bf447

File tree

1 file changed

+48
-46
lines changed

1 file changed

+48
-46
lines changed

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,12 +1316,9 @@ static mlir::omp::DistributeOp
13161316
genDistributeOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
13171317
semantics::SemanticsContext &semaCtx,
13181318
lower::pft::Evaluation &eval, mlir::Location loc,
1319-
const ConstructQueue &queue, ConstructQueue::iterator item) {
1319+
const ConstructQueue &queue, ConstructQueue::iterator item,
1320+
DataSharingProcessor &dsp) {
13201321
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1321-
symTable.pushScope();
1322-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1323-
lower::omp::isLastItemInQueue(item, queue));
1324-
dsp.processStep1();
13251322

13261323
lower::StatementContext stmtCtx;
13271324
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1359,7 +1356,6 @@ genDistributeOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
13591356
.setGenRegionEntryCb(ivCallback),
13601357
queue, item);
13611358

1362-
symTable.popScope();
13631359
return distributeOp;
13641360
}
13651361

@@ -1580,12 +1576,8 @@ static mlir::omp::SimdOp
15801576
genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
15811577
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
15821578
mlir::Location loc, const ConstructQueue &queue,
1583-
ConstructQueue::iterator item) {
1579+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
15841580
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1585-
symTable.pushScope();
1586-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1587-
lower::omp::isLastItemInQueue(item, queue));
1588-
dsp.processStep1();
15891581

15901582
lower::StatementContext stmtCtx;
15911583
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1622,7 +1614,6 @@ genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
16221614
.setGenRegionEntryCb(ivCallback),
16231615
queue, item);
16241616

1625-
symTable.popScope();
16261617
return simdOp;
16271618
}
16281619

@@ -1861,7 +1852,8 @@ static mlir::omp::TaskloopOp
18611852
genTaskloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
18621853
semantics::SemanticsContext &semaCtx,
18631854
lower::pft::Evaluation &eval, mlir::Location loc,
1864-
const ConstructQueue &queue, ConstructQueue::iterator item) {
1855+
const ConstructQueue &queue, ConstructQueue::iterator item,
1856+
DataSharingProcessor &dsp) {
18651857
TODO(loc, "Taskloop construct");
18661858
}
18671859

@@ -1904,12 +1896,8 @@ static mlir::omp::WsloopOp
19041896
genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
19051897
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
19061898
mlir::Location loc, const ConstructQueue &queue,
1907-
ConstructQueue::iterator item) {
1899+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
19081900
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1909-
symTable.pushScope();
1910-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1911-
lower::omp::isLastItemInQueue(item, queue));
1912-
dsp.processStep1();
19131901

19141902
lower::StatementContext stmtCtx;
19151903
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1950,7 +1938,7 @@ genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
19501938
.setDataSharingProcessor(&dsp)
19511939
.setGenRegionEntryCb(ivCallback),
19521940
queue, item);
1953-
symTable.popScope();
1941+
19541942
return wsloopOp;
19551943
}
19561944

@@ -1962,25 +1950,23 @@ static void genCompositeDistributeParallelDo(
19621950
lower::AbstractConverter &converter, lower::SymMap &symTable,
19631951
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
19641952
mlir::Location loc, const ConstructQueue &queue,
1965-
ConstructQueue::iterator item) {
1953+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
19661954
TODO(loc, "Composite DISTRIBUTE PARALLEL DO");
19671955
}
19681956

19691957
static void genCompositeDistributeParallelDoSimd(
19701958
lower::AbstractConverter &converter, lower::SymMap &symTable,
19711959
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
19721960
mlir::Location loc, const ConstructQueue &queue,
1973-
ConstructQueue::iterator item) {
1961+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
19741962
TODO(loc, "Composite DISTRIBUTE PARALLEL DO SIMD");
19751963
}
19761964

1977-
static void genCompositeDistributeSimd(lower::AbstractConverter &converter,
1978-
lower::SymMap &symTable,
1979-
semantics::SemanticsContext &semaCtx,
1980-
lower::pft::Evaluation &eval,
1981-
mlir::Location loc,
1982-
const ConstructQueue &queue,
1983-
ConstructQueue::iterator item) {
1965+
static void genCompositeDistributeSimd(
1966+
lower::AbstractConverter &converter, lower::SymMap &symTable,
1967+
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1968+
mlir::Location loc, const ConstructQueue &queue,
1969+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
19841970
TODO(loc, "Composite DISTRIBUTE SIMD");
19851971
}
19861972

@@ -1989,7 +1975,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
19891975
semantics::SemanticsContext &semaCtx,
19901976
lower::pft::Evaluation &eval, mlir::Location loc,
19911977
const ConstructQueue &queue,
1992-
ConstructQueue::iterator item) {
1978+
ConstructQueue::iterator item,
1979+
DataSharingProcessor &dsp) {
19931980
ClauseProcessor cp(converter, semaCtx, item->clauses);
19941981
cp.processTODO<clause::Aligned, clause::Allocate, clause::Linear,
19951982
clause::Safelen, clause::Simdlen>(loc,
@@ -2002,16 +1989,14 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
20021989
// When support for vectorization is enabled, then we need to add handling of
20031990
// if clause. Currently if clause can be skipped because we always assume
20041991
// SIMD length = 1.
2005-
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
1992+
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item, dsp);
20061993
}
20071994

2008-
static void genCompositeTaskloopSimd(lower::AbstractConverter &converter,
2009-
lower::SymMap &symTable,
2010-
semantics::SemanticsContext &semaCtx,
2011-
lower::pft::Evaluation &eval,
2012-
mlir::Location loc,
2013-
const ConstructQueue &queue,
2014-
ConstructQueue::iterator item) {
1995+
static void genCompositeTaskloopSimd(
1996+
lower::AbstractConverter &converter, lower::SymMap &symTable,
1997+
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1998+
mlir::Location loc, const ConstructQueue &queue,
1999+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
20152000
TODO(loc, "Composite TASKLOOP SIMD");
20162001
}
20172002

@@ -2027,15 +2012,27 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
20272012
ConstructQueue::iterator item) {
20282013
assert(item != queue.end());
20292014

2015+
std::optional<DataSharingProcessor> loopDsp;
2016+
bool loopLeaf = llvm::omp::getDirectiveAssociation(item->id) ==
2017+
llvm::omp::Association::Loop;
2018+
if (loopLeaf) {
2019+
symTable.pushScope();
2020+
loopDsp.emplace(converter, semaCtx, item->clauses, eval,
2021+
/*shouldCollectPreDeterminedSymbols=*/true,
2022+
enableDelayedPrivatization, &symTable);
2023+
loopDsp->processStep1();
2024+
}
2025+
20302026
switch (llvm::omp::Directive dir = item->id) {
20312027
case llvm::omp::Directive::OMPD_barrier:
20322028
genBarrierOp(converter, symTable, semaCtx, eval, loc, queue, item);
20332029
break;
20342030
case llvm::omp::Directive::OMPD_distribute:
2035-
genDistributeOp(converter, symTable, semaCtx, eval, loc, queue, item);
2031+
genDistributeOp(converter, symTable, semaCtx, eval, loc, queue, item,
2032+
*loopDsp);
20362033
break;
20372034
case llvm::omp::Directive::OMPD_do:
2038-
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2035+
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item, *loopDsp);
20392036
break;
20402037
case llvm::omp::Directive::OMPD_loop:
20412038
case llvm::omp::Directive::OMPD_masked:
@@ -2058,7 +2055,7 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
20582055
genSectionsOp(converter, symTable, semaCtx, eval, loc, queue, item);
20592056
break;
20602057
case llvm::omp::Directive::OMPD_simd:
2061-
genSimdOp(converter, symTable, semaCtx, eval, loc, queue, item);
2058+
genSimdOp(converter, symTable, semaCtx, eval, loc, queue, item, *loopDsp);
20622059
break;
20632060
case llvm::omp::Directive::OMPD_single:
20642061
genSingleOp(converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2088,7 +2085,8 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
20882085
genTaskgroupOp(converter, symTable, semaCtx, eval, loc, queue, item);
20892086
break;
20902087
case llvm::omp::Directive::OMPD_taskloop:
2091-
genTaskloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2088+
genTaskloopOp(converter, symTable, semaCtx, eval, loc, queue, item,
2089+
*loopDsp);
20922090
break;
20932091
case llvm::omp::Directive::OMPD_taskwait:
20942092
genTaskwaitOp(converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2114,26 +2112,30 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
21142112
// Composite constructs
21152113
case llvm::omp::Directive::OMPD_distribute_parallel_do:
21162114
genCompositeDistributeParallelDo(converter, symTable, semaCtx, eval, loc,
2117-
queue, item);
2115+
queue, item, *loopDsp);
21182116
break;
21192117
case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
21202118
genCompositeDistributeParallelDoSimd(converter, symTable, semaCtx, eval,
2121-
loc, queue, item);
2119+
loc, queue, item, *loopDsp);
21222120
break;
21232121
case llvm::omp::Directive::OMPD_distribute_simd:
21242122
genCompositeDistributeSimd(converter, symTable, semaCtx, eval, loc, queue,
2125-
item);
2123+
item, *loopDsp);
21262124
break;
21272125
case llvm::omp::Directive::OMPD_do_simd:
2128-
genCompositeDoSimd(converter, symTable, semaCtx, eval, loc, queue, item);
2126+
genCompositeDoSimd(converter, symTable, semaCtx, eval, loc, queue, item,
2127+
*loopDsp);
21292128
break;
21302129
case llvm::omp::Directive::OMPD_taskloop_simd:
21312130
genCompositeTaskloopSimd(converter, symTable, semaCtx, eval, loc, queue,
2132-
item);
2131+
item, *loopDsp);
21332132
break;
21342133
default:
21352134
break;
21362135
}
2136+
2137+
if (loopLeaf)
2138+
symTable.popScope();
21372139
}
21382140

21392141
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)