@@ -1316,12 +1316,9 @@ static mlir::omp::DistributeOp
1316
1316
genDistributeOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1317
1317
semantics::SemanticsContext &semaCtx,
1318
1318
lower::pft::Evaluation &eval, mlir::Location loc,
1319
- const ConstructQueue &queue, ConstructQueue::iterator item) {
1319
+ const ConstructQueue &queue, ConstructQueue::iterator item,
1320
+ DataSharingProcessor &dsp) {
1320
1321
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 ();
1325
1322
1326
1323
lower::StatementContext stmtCtx;
1327
1324
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1359,7 +1356,6 @@ genDistributeOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1359
1356
.setGenRegionEntryCb (ivCallback),
1360
1357
queue, item);
1361
1358
1362
- symTable.popScope ();
1363
1359
return distributeOp;
1364
1360
}
1365
1361
@@ -1580,12 +1576,8 @@ static mlir::omp::SimdOp
1580
1576
genSimdOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1581
1577
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1582
1578
mlir::Location loc, const ConstructQueue &queue,
1583
- ConstructQueue::iterator item) {
1579
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
1584
1580
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 ();
1589
1581
1590
1582
lower::StatementContext stmtCtx;
1591
1583
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1622,7 +1614,6 @@ genSimdOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1622
1614
.setGenRegionEntryCb (ivCallback),
1623
1615
queue, item);
1624
1616
1625
- symTable.popScope ();
1626
1617
return simdOp;
1627
1618
}
1628
1619
@@ -1861,7 +1852,8 @@ static mlir::omp::TaskloopOp
1861
1852
genTaskloopOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1862
1853
semantics::SemanticsContext &semaCtx,
1863
1854
lower::pft::Evaluation &eval, mlir::Location loc,
1864
- const ConstructQueue &queue, ConstructQueue::iterator item) {
1855
+ const ConstructQueue &queue, ConstructQueue::iterator item,
1856
+ DataSharingProcessor &dsp) {
1865
1857
TODO (loc, " Taskloop construct" );
1866
1858
}
1867
1859
@@ -1904,12 +1896,8 @@ static mlir::omp::WsloopOp
1904
1896
genWsloopOp (lower::AbstractConverter &converter, lower::SymMap &symTable,
1905
1897
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1906
1898
mlir::Location loc, const ConstructQueue &queue,
1907
- ConstructQueue::iterator item) {
1899
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
1908
1900
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 ();
1913
1901
1914
1902
lower::StatementContext stmtCtx;
1915
1903
mlir::omp::LoopNestClauseOps loopClauseOps;
@@ -1950,7 +1938,7 @@ genWsloopOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1950
1938
.setDataSharingProcessor (&dsp)
1951
1939
.setGenRegionEntryCb (ivCallback),
1952
1940
queue, item);
1953
- symTable. popScope ();
1941
+
1954
1942
return wsloopOp;
1955
1943
}
1956
1944
@@ -1962,25 +1950,23 @@ static void genCompositeDistributeParallelDo(
1962
1950
lower::AbstractConverter &converter, lower::SymMap &symTable,
1963
1951
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1964
1952
mlir::Location loc, const ConstructQueue &queue,
1965
- ConstructQueue::iterator item) {
1953
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
1966
1954
TODO (loc, " Composite DISTRIBUTE PARALLEL DO" );
1967
1955
}
1968
1956
1969
1957
static void genCompositeDistributeParallelDoSimd (
1970
1958
lower::AbstractConverter &converter, lower::SymMap &symTable,
1971
1959
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
1972
1960
mlir::Location loc, const ConstructQueue &queue,
1973
- ConstructQueue::iterator item) {
1961
+ ConstructQueue::iterator item, DataSharingProcessor &dsp ) {
1974
1962
TODO (loc, " Composite DISTRIBUTE PARALLEL DO SIMD" );
1975
1963
}
1976
1964
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) {
1984
1970
TODO (loc, " Composite DISTRIBUTE SIMD" );
1985
1971
}
1986
1972
@@ -1989,7 +1975,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
1989
1975
semantics::SemanticsContext &semaCtx,
1990
1976
lower::pft::Evaluation &eval, mlir::Location loc,
1991
1977
const ConstructQueue &queue,
1992
- ConstructQueue::iterator item) {
1978
+ ConstructQueue::iterator item,
1979
+ DataSharingProcessor &dsp) {
1993
1980
ClauseProcessor cp (converter, semaCtx, item->clauses );
1994
1981
cp.processTODO <clause::Aligned, clause::Allocate, clause::Linear,
1995
1982
clause::Safelen, clause::Simdlen>(loc,
@@ -2002,16 +1989,14 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
2002
1989
// When support for vectorization is enabled, then we need to add handling of
2003
1990
// if clause. Currently if clause can be skipped because we always assume
2004
1991
// SIMD length = 1.
2005
- genWsloopOp (converter, symTable, semaCtx, eval, loc, queue, item);
1992
+ genWsloopOp (converter, symTable, semaCtx, eval, loc, queue, item, dsp );
2006
1993
}
2007
1994
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) {
2015
2000
TODO (loc, " Composite TASKLOOP SIMD" );
2016
2001
}
2017
2002
@@ -2027,15 +2012,27 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2027
2012
ConstructQueue::iterator item) {
2028
2013
assert (item != queue.end ());
2029
2014
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
+
2030
2026
switch (llvm::omp::Directive dir = item->id ) {
2031
2027
case llvm::omp::Directive::OMPD_barrier:
2032
2028
genBarrierOp (converter, symTable, semaCtx, eval, loc, queue, item);
2033
2029
break ;
2034
2030
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);
2036
2033
break ;
2037
2034
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 );
2039
2036
break ;
2040
2037
case llvm::omp::Directive::OMPD_loop:
2041
2038
case llvm::omp::Directive::OMPD_masked:
@@ -2058,7 +2055,7 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2058
2055
genSectionsOp (converter, symTable, semaCtx, eval, loc, queue, item);
2059
2056
break ;
2060
2057
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 );
2062
2059
break ;
2063
2060
case llvm::omp::Directive::OMPD_single:
2064
2061
genSingleOp (converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2088,7 +2085,8 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2088
2085
genTaskgroupOp (converter, symTable, semaCtx, eval, loc, queue, item);
2089
2086
break ;
2090
2087
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);
2092
2090
break ;
2093
2091
case llvm::omp::Directive::OMPD_taskwait:
2094
2092
genTaskwaitOp (converter, symTable, semaCtx, eval, loc, queue, item);
@@ -2114,26 +2112,30 @@ static void genOMPDispatch(lower::AbstractConverter &converter,
2114
2112
// Composite constructs
2115
2113
case llvm::omp::Directive::OMPD_distribute_parallel_do:
2116
2114
genCompositeDistributeParallelDo (converter, symTable, semaCtx, eval, loc,
2117
- queue, item);
2115
+ queue, item, *loopDsp );
2118
2116
break ;
2119
2117
case llvm::omp::Directive::OMPD_distribute_parallel_do_simd:
2120
2118
genCompositeDistributeParallelDoSimd (converter, symTable, semaCtx, eval,
2121
- loc, queue, item);
2119
+ loc, queue, item, *loopDsp );
2122
2120
break ;
2123
2121
case llvm::omp::Directive::OMPD_distribute_simd:
2124
2122
genCompositeDistributeSimd (converter, symTable, semaCtx, eval, loc, queue,
2125
- item);
2123
+ item, *loopDsp );
2126
2124
break ;
2127
2125
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);
2129
2128
break ;
2130
2129
case llvm::omp::Directive::OMPD_taskloop_simd:
2131
2130
genCompositeTaskloopSimd (converter, symTable, semaCtx, eval, loc, queue,
2132
- item);
2131
+ item, *loopDsp );
2133
2132
break ;
2134
2133
default :
2135
2134
break ;
2136
2135
}
2136
+
2137
+ if (loopLeaf)
2138
+ symTable.popScope ();
2137
2139
}
2138
2140
2139
2141
// ===----------------------------------------------------------------------===//
0 commit comments