@@ -1340,12 +1340,9 @@ static mlir::omp::DistributeOp
1340
1340
genDistributeOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1341
1341
semantics::SemanticsContext &semaCtx,
1342
1342
lower::pft::Evaluation &eval, mlir::Location loc,
1343
- const ConstructQueue &queue, ConstructQueue::iterator item) {
1343
+ const ConstructQueue &queue, ConstructQueue::iterator item,
1344
+ DataSharingProcessor &dsp) {
1344
1345
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 ();
1349
1346
1350
1347
lower::StatementContext stmtCtx;
1351
1348
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1383,7 +1380,6 @@ genDistributeOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1383
1380
.setGenRegionEntryCb (ivCallback),
1384
1381
queue, item);
1385
1382
1386
- symTable.popScope ();
1387
1383
return distributeOp;
1388
1384
}
1389
1385
@@ -1611,12 +1607,8 @@ static mlir::omp::SimdOp
1611
1607
genSimdOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1612
1608
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1613
1609
mlir::Location loc, const ConstructQueue &queue,
1614
- ConstructQueue::iterator item) {
1610
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
1615
1611
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 ();
1620
1612
1621
1613
lower::StatementContext stmtCtx;
1622
1614
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1653,7 +1645,6 @@ genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1653
1645
.setGenRegionEntryCb (ivCallback),
1654
1646
queue, item);
1655
1647
1656
- symTable.popScope ();
1657
1648
return simdOp;
1658
1649
}
1659
1650
@@ -1892,7 +1883,8 @@ static mlir::omp::TaskloopOp
1892
1883
genTaskloopOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1893
1884
semantics::SemanticsContext &semaCtx,
1894
1885
lower::pft::Evaluation &eval, mlir::Location loc,
1895
- const ConstructQueue &queue, ConstructQueue::iterator item) {
1886
+ const ConstructQueue &queue, ConstructQueue::iterator item,
1887
+ DataSharingProcessor &dsp) {
1896
1888
TODO (loc, " Taskloop construct" );
1897
1889
}
1898
1890
@@ -1936,12 +1928,8 @@ static mlir::omp::WsloopOp
1936
1928
genWsloopOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1937
1929
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1938
1930
mlir::Location loc, const ConstructQueue &queue,
1939
- ConstructQueue::iterator item) {
1931
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
1940
1932
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 ();
1945
1933
1946
1934
lower::StatementContext stmtCtx;
1947
1935
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1983,7 +1971,7 @@ genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1983
1971
.setReductions (&reductionSyms, &reductionTypes)
1984
1972
.setGenRegionEntryCb (ivCallback),
1985
1973
queue, item);
1986
- symTable. popScope ();
1974
+
1987
1975
return wsloopOp;
1988
1976
}
1989
1977
@@ -1995,25 +1983,23 @@ static void genCompositeDistributeParallelDo(
1995
1983
lower::AbstractConverter &converter, lower::SymMap &symTable,
1996
1984
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1997
1985
mlir::Location loc, const ConstructQueue &queue,
1998
- ConstructQueue::iterator item) {
1986
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
1999
1987
TODO (loc, " Composite DISTRIBUTE PARALLEL DO" );
2000
1988
}
2001
1989
2002
1990
static void genCompositeDistributeParallelDoSimd (
2003
1991
lower::AbstractConverter &converter, lower::SymMap &symTable,
2004
1992
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2005
1993
mlir::Location loc, const ConstructQueue &queue,
2006
- ConstructQueue::iterator item) {
1994
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
2007
1995
TODO (loc, " Composite DISTRIBUTE PARALLEL DO SIMD" );
2008
1996
}
2009
1997
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) {
2017
2003
TODO (loc, " Composite DISTRIBUTE SIMD" );
2018
2004
}
2019
2005
@@ -2022,7 +2008,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
2022
2008
semantics::SemanticsContext &semaCtx,
2023
2009
lower::pft::Evaluation &eval, mlir::Location loc,
2024
2010
const ConstructQueue &queue,
2025
- ConstructQueue::iterator item) {
2011
+ ConstructQueue::iterator item,
2012
+ DataSharingProcessor &dsp) {
2026
2013
ClauseProcessor cp (converter, semaCtx, item->clauses );
2027
2014
cp.processTODO <clause::Aligned, clause::Allocate, clause::Linear,
2028
2015
clause::Safelen, clause::Simdlen>(loc,
@@ -2035,16 +2022,14 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
2035
2022
// When support for vectorization is enabled, then we need to add handling of
2036
2023
// if clause. Currently if clause can be skipped because we always assume
2037
2024
// SIMD length = 1.
2038
- genWsloopOp (converter, symTable, semaCtx, eval, loc, queue, item);
2025
+ genWsloopOp (converter, symTable, semaCtx, eval, loc, queue, item, dsp );
2039
2026
}
2040
2027
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) {
2048
2033
TODO (loc, " Composite TASKLOOP SIMD" );
2049
2034
}
2050
2035
@@ -2060,15 +2045,27 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2060
2045
ConstructQueue::iterator item) {
2061
2046
assert (item != queue.end ());
2062
2047
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
+
2063
2059
switch (llvm::omp::Directive dir = item->id ) {
2064
2060
case llvm::omp::Directive::OMPD_barrier:
2065
2061
genBarrierOp (converter, symTable, semaCtx, eval, loc, queue, item);
2066
2062
break ;
2067
2063
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);
2069
2066
break ;
2070
2067
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 );
2072
2069
break ;
2073
2070
case llvm::omp::Directive::OMPD_loop:
2074
2071
case llvm::omp::Directive::OMPD_masked:
@@ -2092,7 +2089,7 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2092
2089
genSectionsOp (converter, symTable, semaCtx, eval, loc, queue, item);
2093
2090
break ;
2094
2091
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 );
2096
2093
break ;
2097
2094
case llvm::omp::Directive::OMPD_single:
2098
2095
genSingleOp (converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2122,7 +2119,8 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2122
2119
genTaskgroupOp (converter, symTable, semaCtx, eval, loc, queue, item);
2123
2120
break ;
2124
2121
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);
2126
2124
break ;
2127
2125
case llvm::omp::Directive::OMPD_taskwait:
2128
2126
genTaskwaitOp (converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2148,26 +2146,30 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2148
2146
// Composite constructs
2149
2147
case llvm::omp::Directive::OMPD_distribute_parallel_do:
2150
2148
genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2151
- queue, item);
2149
+ queue, item, *loopDsp );
2152
2150
break ;
2153
2151
case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
2154
2152
genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2155
- loc, queue, item);
2153
+ loc, queue, item, *loopDsp );
2156
2154
break ;
2157
2155
case llvm::omp::Directive::OMPD_distribute_simd:
2158
2156
genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2159
- item);
2157
+ item, *loopDsp );
2160
2158
break ;
2161
2159
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);
2163
2162
break ;
2164
2163
case llvm::omp::Directive::OMPD_taskloop_simd:
2165
2164
genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2166
- item);
2165
+ item, *loopDsp );
2167
2166
break ;
2168
2167
default :
2169
2168
break ;
2170
2169
}
2170
+
2171
+ if (loopLeaf)
2172
+ symTable.popScope ();
2171
2173
}
2172
2174
2173
2175
// ===----------------------------------------------------------------------===//
0 commit comments