Skip to content

Commit c2a4e9c

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 817f0d9 commit c2a4e9c

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

13521349
lower::StatementContext stmtCtx;
13531350
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1385,7 +1382,6 @@ genDistributeOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
13851382
.setGenRegionEntryCb(ivCallback),
13861383
queue, item);
13871384

1388-
symTable.popScope();
13891385
return distributeOp;
13901386
}
13911387

@@ -1613,12 +1609,8 @@ static mlir::omp::SimdOp
16131609
genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
16141610
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
16151611
mlir::Location loc, const ConstructQueue &queue,
1616-
ConstructQueue::iterator item) {
1612+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
16171613
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1618-
symTable.pushScope();
1619-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1620-
lower::omp::isLastItemInQueue(item, queue));
1621-
dsp.processStep1();
16221614

16231615
lower::StatementContext stmtCtx;
16241616
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1655,7 +1647,6 @@ genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
16551647
.setGenRegionEntryCb(ivCallback),
16561648
queue, item);
16571649

1658-
symTable.popScope();
16591650
return simdOp;
16601651
}
16611652

@@ -1894,7 +1885,8 @@ static mlir::omp::TaskloopOp
18941885
genTaskloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
18951886
semantics::SemanticsContext &semaCtx,
18961887
lower::pft::Evaluation &eval, mlir::Location loc,
1897-
const ConstructQueue &queue, ConstructQueue::iterator item) {
1888+
const ConstructQueue &queue, ConstructQueue::iterator item,
1889+
DataSharingProcessor &dsp) {
18981890
TODO(loc, "Taskloop construct");
18991891
}
19001892

@@ -1938,12 +1930,8 @@ static mlir::omp::WsloopOp
19381930
genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
19391931
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
19401932
mlir::Location loc, const ConstructQueue &queue,
1941-
ConstructQueue::iterator item) {
1933+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
19421934
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
1943-
symTable.pushScope();
1944-
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
1945-
lower::omp::isLastItemInQueue(item, queue));
1946-
dsp.processStep1();
19471935

19481936
lower::StatementContext stmtCtx;
19491937
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1985,7 +1973,7 @@ genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
19851973
.setReductions(&reductionSyms, &reductionTypes)
19861974
.setGenRegionEntryCb(ivCallback),
19871975
queue, item);
1988-
symTable.popScope();
1976+
19891977
return wsloopOp;
19901978
}
19911979

@@ -1997,25 +1985,23 @@ static void genCompositeDistributeParallelDo(
19971985
lower::AbstractConverter &converter, lower::SymMap &symTable,
19981986
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
19991987
mlir::Location loc, const ConstructQueue &queue,
2000-
ConstructQueue::iterator item) {
1988+
ConstructQueue::iterator item, DataSharingProcessor &dsp) {
20011989
TODO(loc, "Composite DISTRIBUTE PARALLEL DO");
20021990
}
20031991

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

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

@@ -2024,7 +2010,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
20242010
semantics::SemanticsContext &semaCtx,
20252011
lower::pft::Evaluation &eval, mlir::Location loc,
20262012
const ConstructQueue &queue,
2027-
ConstructQueue::iterator item) {
2013+
ConstructQueue::iterator item,
2014+
DataSharingProcessor &dsp) {
20282015
ClauseProcessor cp(converter, semaCtx, item->clauses);
20292016
cp.processTODO<clause::Aligned, clause::Allocate, clause::Linear,
20302017
clause::Safelen, clause::Simdlen>(loc,
@@ -2037,16 +2024,14 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
20372024
// When support for vectorization is enabled, then we need to add handling of
20382025
// if clause. Currently if clause can be skipped because we always assume
20392026
// SIMD length = 1.
2040-
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2027+
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item, dsp);
20412028
}
20422029

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

@@ -2062,15 +2047,27 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
20622047
ConstructQueue::iterator item) {
20632048
assert(item != queue.end());
20642049

2050+
std::optional<DataSharingProcessor> loopDsp;
2051+
bool loopLeaf = llvm::omp::getDirectiveAssociation(item->id) ==
2052+
llvm::omp::Association::Loop;
2053+
if (loopLeaf) {
2054+
symTable.pushScope();
2055+
loopDsp.emplace(converter, semaCtx, item->clauses, eval,
2056+
/*shouldCollectPreDeterminedSymbols=*/true,
2057+
enableDelayedPrivatization, &symTable);
2058+
loopDsp->processStep1();
2059+
}
2060+
20652061
switch (llvm::omp::Directive dir = item->id) {
20662062
case llvm::omp::Directive::OMPD_barrier:
20672063
genBarrierOp(converter, symTable, semaCtx, eval, loc, queue, item);
20682064
break;
20692065
case llvm::omp::Directive::OMPD_distribute:
2070-
genDistributeOp(converter, symTable, semaCtx, eval, loc, queue, item);
2066+
genDistributeOp(converter, symTable, semaCtx, eval, loc, queue, item,
2067+
*loopDsp);
20712068
break;
20722069
case llvm::omp::Directive::OMPD_do:
2073-
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2070+
genWsloopOp(converter, symTable, semaCtx, eval, loc, queue, item, *loopDsp);
20742071
break;
20752072
case llvm::omp::Directive::OMPD_loop:
20762073
case llvm::omp::Directive::OMPD_masked:
@@ -2094,7 +2091,7 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
20942091
genSectionsOp(converter, symTable, semaCtx, eval, loc, queue, item);
20952092
break;
20962093
case llvm::omp::Directive::OMPD_simd:
2097-
genSimdOp(converter, symTable, semaCtx, eval, loc, queue, item);
2094+
genSimdOp(converter, symTable, semaCtx, eval, loc, queue, item, *loopDsp);
20982095
break;
20992096
case llvm::omp::Directive::OMPD_single:
21002097
genSingleOp(converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2124,7 +2121,8 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
21242121
genTaskgroupOp(converter, symTable, semaCtx, eval, loc, queue, item);
21252122
break;
21262123
case llvm::omp::Directive::OMPD_taskloop:
2127-
genTaskloopOp(converter, symTable, semaCtx, eval, loc, queue, item);
2124+
genTaskloopOp(converter, symTable, semaCtx, eval, loc, queue, item,
2125+
*loopDsp);
21282126
break;
21292127
case llvm::omp::Directive::OMPD_taskwait:
21302128
genTaskwaitOp(converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2150,26 +2148,30 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
21502148
// Composite constructs
21512149
case llvm::omp::Directive::OMPD_distribute_parallel_do:
21522150
genCompositeDistributeParallelDo(converter, symTable, semaCtx, eval, loc,
2153-
queue, item);
2151+
queue, item, *loopDsp);
21542152
break;
21552153
case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
21562154
genCompositeDistributeParallelDoSimd(converter, symTable, semaCtx, eval,
2157-
loc, queue, item);
2155+
loc, queue, item, *loopDsp);
21582156
break;
21592157
case llvm::omp::Directive::OMPD_distribute_simd:
21602158
genCompositeDistributeSimd(converter, symTable, semaCtx, eval, loc, queue,
2161-
item);
2159+
item, *loopDsp);
21622160
break;
21632161
case llvm::omp::Directive::OMPD_do_simd:
2164-
genCompositeDoSimd(converter, symTable, semaCtx, eval, loc, queue, item);
2162+
genCompositeDoSimd(converter, symTable, semaCtx, eval, loc, queue, item,
2163+
*loopDsp);
21652164
break;
21662165
case llvm::omp::Directive::OMPD_taskloop_simd:
21672166
genCompositeTaskloopSimd(converter, symTable, semaCtx, eval, loc, queue,
2168-
item);
2167+
item, *loopDsp);
21692168
break;
21702169
default:
21712170
break;
21722171
}
2172+
2173+
if (loopLeaf)
2174+
symTable.popScope();
21732175
}
21742176

21752177
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)