Skip to content

Commit 0559537

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 83d53c3 commit 0559537

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
@@ -1340,12 +1340,9 @@ static mlir::omp::DistributeOp
13401340
genDistributeOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
13411341
semantics::SemanticsContext &semaCtx,
13421342
lower::pft::Evaluation &eval, mlir::Location loc,
1343-
const ConstructQueue &queue, ConstructQueue::iterator item) {
1343+
const ConstructQueue &queue, ConstructQueue::iterator item,
1344+
DataSharingProcessor &dsp) {
13441345
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1345-
symTable.pushScope();
1346-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1347-
lower::omp::isLastItemInQueue(item, queue));
1348-
dsp.processStep1();
13491346

13501347
lower::StatementContext stmtCtx;
13511348
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1383,7 +1380,6 @@ genDistributeOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
13831380
.setGenRegionEntryCb(ivCallback),
13841381
queue, item);
13851382

1386-
symTable.popScope();
13871383
return distributeOp;
13881384
}
13891385

@@ -1611,12 +1607,8 @@ static mlir::omp::SimdOp
16111607
genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
16121608
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
16131609
mlir::Location loc, const ConstructQueue &queue,
1614-
ConstructQueue::iterator item) {
1610+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
16151611
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1616-
symTable.pushScope();
1617-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1618-
lower::omp::isLastItemInQueue(item, queue));
1619-
dsp.processStep1();
16201612

16211613
lower::StatementContext stmtCtx;
16221614
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1653,7 +1645,6 @@ genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
16531645
.setGenRegionEntryCb(ivCallback),
16541646
queue, item);
16551647

1656-
symTable.popScope();
16571648
return simdOp;
16581649
}
16591650

@@ -1892,7 +1883,8 @@ static mlir::omp::TaskloopOp
18921883
genTaskloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
18931884
semantics::SemanticsContext &semaCtx,
18941885
lower::pft::Evaluation &eval, mlir::Location loc,
1895-
const ConstructQueue &queue, ConstructQueue::iterator item) {
1886+
const ConstructQueue &queue, ConstructQueue::iterator item,
1887+
DataSharingProcessor &dsp) {
18961888
TODO(loc, "Taskloop construct");
18971889
}
18981890

@@ -1936,12 +1928,8 @@ static mlir::omp::WsloopOp
19361928
genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
19371929
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
19381930
mlir::Location loc, const ConstructQueue &queue,
1939-
ConstructQueue::iterator item) {
1931+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
19401932
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1941-
symTable.pushScope();
1942-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1943-
lower::omp::isLastItemInQueue(item, queue));
1944-
dsp.processStep1();
19451933

19461934
lower::StatementContext stmtCtx;
19471935
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1983,7 +1971,7 @@ genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
19831971
.setReductions(&reductionSyms, &reductionTypes)
19841972
.setGenRegionEntryCb(ivCallback),
19851973
queue, item);
1986-
symTable.popScope();
1974+
19871975
return wsloopOp;
19881976
}
19891977

@@ -1995,25 +1983,23 @@ static void genCompositeDistributeParallelDo(
19951983
lower::AbstractConverter &converter, lower::SymMap &symTable,
19961984
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
19971985
mlir::Location loc, const ConstructQueue &queue,
1998-
ConstructQueue::iterator item) {
1986+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
19991987
TODO(loc, "Composite DISTRIBUTE PARALLEL DO");
20001988
}
20011989

20021990
static void genCompositeDistributeParallelDoSimd(
20031991
lower::AbstractConverter &converter, lower::SymMap &symTable,
20041992
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
20051993
mlir::Location loc, const ConstructQueue &queue,
2006-
ConstructQueue::iterator item) {
1994+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
20071995
TODO(loc, "Composite DISTRIBUTE PARALLEL DO SIMD");
20081996
}
20091997

2010-
static void genCompositeDistributeSimd(lower::AbstractConverter &converter,
2011-
lower::SymMap &symTable,
2012-
semantics::SemanticsContext &semaCtx,
2013-
lower::pft::Evaluation &eval,
2014-
mlir::Location loc,
2015-
const ConstructQueue &queue,
2016-
ConstructQueue::iterator item) {
1998+
static void genCompositeDistributeSimd(
1999+
lower::AbstractConverter &converter, lower::SymMap &symTable,
2000+
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2001+
mlir::Location loc, const ConstructQueue &queue,
2002+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
20172003
TODO(loc, "Composite DISTRIBUTE SIMD");
20182004
}
20192005

@@ -2022,7 +2008,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
20222008
semantics::SemanticsContext &semaCtx,
20232009
lower::pft::Evaluation &eval, mlir::Location loc,
20242010
const ConstructQueue &queue,
2025-
ConstructQueue::iterator item) {
2011+
ConstructQueue::iterator item,
2012+
DataSharingProcessor &dsp) {
20262013
ClauseProcessor cp(converter, semaCtx, item->clauses);
20272014
cp.processTODO<clause::Aligned, clause::Allocate, clause::Linear,
20282015
clause::Safelen, clause::Simdlen>(loc,
@@ -2035,16 +2022,14 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
20352022
// When support for vectorization is enabled, then we need to add handling of
20362023
// if clause. Currently if clause can be skipped because we always assume
20372024
// SIMD length = 1.
2038-
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2025+
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item, dsp);
20392026
}
20402027

2041-
static void genCompositeTaskloopSimd(lower::AbstractConverter &converter,
2042-
lower::SymMap &symTable,
2043-
semantics::SemanticsContext &semaCtx,
2044-
lower::pft::Evaluation &eval,
2045-
mlir::Location loc,
2046-
const ConstructQueue &queue,
2047-
ConstructQueue::iterator item) {
2028+
static void genCompositeTaskloopSimd(
2029+
lower::AbstractConverter &converter, lower::SymMap &symTable,
2030+
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2031+
mlir::Location loc, const ConstructQueue &queue,
2032+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
20482033
TODO(loc, "Composite TASKLOOP SIMD");
20492034
}
20502035

@@ -2060,15 +2045,27 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
20602045
ConstructQueue::iterator item) {
20612046
assert(item != queue.end());
20622047

2048+
std::optional<DataSharingProcessor> loopDsp;
2049+
bool loopLeaf = llvm::omp::getDirectiveAssociation(item->id) ==
2050+
llvm::omp::Association::Loop;
2051+
if (loopLeaf) {
2052+
symTable.pushScope();
2053+
loopDsp.emplace(converter, semaCtx, item->clauses, eval,
2054+
/*shouldCollectPreDeterminedSymbols=*/true,
2055+
enableDelayedPrivatization, &symTable);
2056+
loopDsp->processStep1();
2057+
}
2058+
20632059
switch (llvm::omp::Directive dir = item->id) {
20642060
case llvm::omp::Directive::OMPD_barrier:
20652061
genBarrierOp(converter, symTable, semaCtx, eval, loc, queue, item);
20662062
break;
20672063
case llvm::omp::Directive::OMPD_distribute:
2068-
genDistributeOp(converter, symTable, semaCtx, eval, loc, queue, item);
2064+
genDistributeOp(converter, symTable, semaCtx, eval, loc, queue, item,
2065+
*loopDsp);
20692066
break;
20702067
case llvm::omp::Directive::OMPD_do:
2071-
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2068+
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item, *loopDsp);
20722069
break;
20732070
case llvm::omp::Directive::OMPD_loop:
20742071
case llvm::omp::Directive::OMPD_masked:
@@ -2092,7 +2089,7 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
20922089
genSectionsOp(converter, symTable, semaCtx, eval, loc, queue, item);
20932090
break;
20942091
case llvm::omp::Directive::OMPD_simd:
2095-
genSimdOp(converter, symTable, semaCtx, eval, loc, queue, item);
2092+
genSimdOp(converter, symTable, semaCtx, eval, loc, queue, item, *loopDsp);
20962093
break;
20972094
case llvm::omp::Directive::OMPD_single:
20982095
genSingleOp(converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2122,7 +2119,8 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
21222119
genTaskgroupOp(converter, symTable, semaCtx, eval, loc, queue, item);
21232120
break;
21242121
case llvm::omp::Directive::OMPD_taskloop:
2125-
genTaskloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2122+
genTaskloopOp(converter, symTable, semaCtx, eval, loc, queue, item,
2123+
*loopDsp);
21262124
break;
21272125
case llvm::omp::Directive::OMPD_taskwait:
21282126
genTaskwaitOp(converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2148,26 +2146,30 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
21482146
// Composite constructs
21492147
case llvm::omp::Directive::OMPD_distribute_parallel_do:
21502148
genCompositeDistributeParallelDo(converter, symTable, semaCtx, eval, loc,
2151-
queue, item);
2149+
queue, item, *loopDsp);
21522150
break;
21532151
case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
21542152
genCompositeDistributeParallelDoSimd(converter, symTable, semaCtx, eval,
2155-
loc, queue, item);
2153+
loc, queue, item, *loopDsp);
21562154
break;
21572155
case llvm::omp::Directive::OMPD_distribute_simd:
21582156
genCompositeDistributeSimd(converter, symTable, semaCtx, eval, loc, queue,
2159-
item);
2157+
item, *loopDsp);
21602158
break;
21612159
case llvm::omp::Directive::OMPD_do_simd:
2162-
genCompositeDoSimd(converter, symTable, semaCtx, eval, loc, queue, item);
2160+
genCompositeDoSimd(converter, symTable, semaCtx, eval, loc, queue, item,
2161+
*loopDsp);
21632162
break;
21642163
case llvm::omp::Directive::OMPD_taskloop_simd:
21652164
genCompositeTaskloopSimd(converter, symTable, semaCtx, eval, loc, queue,
2166-
item);
2165+
item, *loopDsp);
21672166
break;
21682167
default:
21692168
break;
21702169
}
2170+
2171+
if (loopLeaf)
2172+
symTable.popScope();
21712173
}
21722174

21732175
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)