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