@@ -992,6 +992,29 @@ static OpTy genOpWithBody(const OpWithBodyGenInfo &info,
992
992
return op;
993
993
}
994
994
995
+ template <typename OpTy, typename ClauseOpsTy>
996
+ static OpTy genWrapperOp (lower::AbstractConverter &converter,
997
+ mlir::Location loc, const ClauseOpsTy &clauseOps,
998
+ llvm::ArrayRef<mlir::Type> blockArgTypes) {
999
+ static_assert (
1000
+ OpTy::template hasTrait<mlir::omp::LoopWrapperInterface::Trait>(),
1001
+ " expected a loop wrapper" );
1002
+ fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
1003
+
1004
+ // Create wrapper.
1005
+ auto op = firOpBuilder.create <OpTy>(loc, clauseOps);
1006
+
1007
+ // Create entry block with arguments.
1008
+ llvm::SmallVector<mlir::Location> locs{blockArgTypes.size (), loc};
1009
+ firOpBuilder.createBlock (&op.getRegion (), /* insertPt=*/ {}, blockArgTypes,
1010
+ locs);
1011
+
1012
+ firOpBuilder.setInsertionPoint (
1013
+ lower::genOpenMPTerminator (firOpBuilder, op, loc));
1014
+
1015
+ return op;
1016
+ }
1017
+
995
1018
// ===----------------------------------------------------------------------===//
996
1019
// Code generation functions for clauses
997
1020
// ===----------------------------------------------------------------------===//
@@ -1337,7 +1360,7 @@ genLoopNestOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1337
1360
llvm::omp::Directive directive, DataSharingProcessor &dsp) {
1338
1361
auto ivCallback = [&](mlir::Operation *op) {
1339
1362
genLoopVars (op, converter, loc, iv, wrapperSyms, wrapperArgs);
1340
- return llvm::SmallVector<const semantics::Symbol *>(iv) ;
1363
+ return llvm::SmallVector<const semantics::Symbol *>{iv} ;
1341
1364
};
1342
1365
1343
1366
auto *nestedEval =
@@ -1397,7 +1420,7 @@ static mlir::omp::ParallelOp genParallelOp(
1397
1420
1398
1421
auto reductionCallback = [&](mlir::Operation *op) {
1399
1422
genReductionVars (op, converter, loc, reductionSyms, reductionTypes);
1400
- return llvm::SmallVector<const semantics::Symbol *>( reductionSyms) ;
1423
+ return llvm::SmallVector<const semantics::Symbol *>{ reductionSyms} ;
1401
1424
};
1402
1425
1403
1426
OpWithBodyGenInfo genInfo =
@@ -1437,7 +1460,7 @@ static mlir::omp::ParallelOp genParallelOp(
1437
1460
firOpBuilder.createBlock (®ion, /* insertPt=*/ {}, allRegionArgTypes,
1438
1461
allRegionArgLocs);
1439
1462
1440
- llvm::SmallVector<const semantics::Symbol *> allSymbols ( reductionSyms) ;
1463
+ llvm::SmallVector<const semantics::Symbol *> allSymbols{ reductionSyms} ;
1441
1464
allSymbols.append (dsp.getAllSymbolsToPrivatize ().begin (),
1442
1465
dsp.getAllSymbolsToPrivatize ().end ());
1443
1466
@@ -1814,78 +1837,6 @@ genTeamsOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
1814
1837
queue, item, clauseOps);
1815
1838
}
1816
1839
1817
- // ===----------------------------------------------------------------------===//
1818
- // Code generation functions for loop wrappers
1819
- // ===----------------------------------------------------------------------===//
1820
-
1821
- static mlir::omp::DistributeOp
1822
- genDistributeWrapperOp (lower::AbstractConverter &converter,
1823
- semantics::SemanticsContext &semaCtx,
1824
- lower::pft::Evaluation &eval, mlir::Location loc,
1825
- const mlir::omp::DistributeClauseOps &clauseOps) {
1826
- fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
1827
-
1828
- // Create omp.distribute wrapper.
1829
- auto distributeOp =
1830
- firOpBuilder.create <mlir::omp::DistributeOp>(loc, clauseOps);
1831
-
1832
- // TODO: Populate entry block arguments with private variables.
1833
- firOpBuilder.createBlock (&distributeOp.getRegion ());
1834
- firOpBuilder.setInsertionPoint (
1835
- lower::genOpenMPTerminator (firOpBuilder, distributeOp, loc));
1836
-
1837
- return distributeOp;
1838
- }
1839
-
1840
- static mlir::omp::SimdOp
1841
- genSimdWrapperOp (lower::AbstractConverter &converter,
1842
- semantics::SemanticsContext &semaCtx,
1843
- lower::pft::Evaluation &eval, mlir::Location loc,
1844
- const mlir::omp::SimdClauseOps &clauseOps) {
1845
- fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
1846
-
1847
- // Create omp.simd wrapper.
1848
- auto simdOp = firOpBuilder.create <mlir::omp::SimdOp>(loc, clauseOps);
1849
-
1850
- // TODO: Populate entry block arguments with reduction and private variables.
1851
- firOpBuilder.createBlock (&simdOp.getRegion ());
1852
- firOpBuilder.setInsertionPoint (
1853
- lower::genOpenMPTerminator (firOpBuilder, simdOp, loc));
1854
-
1855
- return simdOp;
1856
- }
1857
-
1858
- static mlir::omp::TaskloopOp
1859
- genTaskloopWrapperOp (lower::AbstractConverter &converter,
1860
- semantics::SemanticsContext &semaCtx,
1861
- lower::pft::Evaluation &eval, mlir::Location loc,
1862
- const mlir::omp::TaskloopClauseOps &clauseOps) {
1863
- TODO (loc, " Taskloop construct" );
1864
- }
1865
-
1866
- static mlir::omp::WsloopOp
1867
- genWsloopWrapperOp (lower::AbstractConverter &converter,
1868
- semantics::SemanticsContext &semaCtx,
1869
- lower::pft::Evaluation &eval, mlir::Location loc,
1870
- const mlir::omp::WsloopClauseOps &clauseOps,
1871
- llvm::ArrayRef<const semantics::Symbol *> reductionSyms,
1872
- llvm::ArrayRef<mlir::Type> reductionTypes) {
1873
- fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
1874
-
1875
- // Create omp.wsloop wrapper.
1876
- llvm::SmallVector<mlir::Location> reductionLocs (reductionSyms.size (), loc);
1877
- auto wsloopOp = firOpBuilder.create <mlir::omp::WsloopOp>(loc, clauseOps);
1878
-
1879
- // Populate entry block arguments with reduction variables.
1880
- // TODO: Add private variables to entry block arguments.
1881
- firOpBuilder.createBlock (&wsloopOp.getRegion (), {}, reductionTypes,
1882
- reductionLocs);
1883
- firOpBuilder.setInsertionPoint (
1884
- lower::genOpenMPTerminator (firOpBuilder, wsloopOp, loc));
1885
-
1886
- return wsloopOp;
1887
- }
1888
-
1889
1840
// ===----------------------------------------------------------------------===//
1890
1841
// Code generation functions for the standalone version of constructs that can
1891
1842
// also be a leaf of a composite construct
@@ -1907,8 +1858,9 @@ static void genStandaloneDistribute(
1907
1858
genLoopNestClauses (converter, semaCtx, eval, item->clauses , loc,
1908
1859
loopNestClauseOps, iv);
1909
1860
1910
- auto distributeOp = genDistributeWrapperOp (converter, semaCtx, eval, loc,
1911
- distributeClauseOps);
1861
+ // TODO: Populate entry block arguments with private variables.
1862
+ auto distributeOp = genWrapperOp<mlir::omp::DistributeOp>(
1863
+ converter, loc, distributeClauseOps, /* blockArgTypes=*/ {});
1912
1864
1913
1865
genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item,
1914
1866
loopNestClauseOps, iv,
@@ -1936,9 +1888,9 @@ static void genStandaloneDo(lower::AbstractConverter &converter,
1936
1888
genLoopNestClauses (converter, semaCtx, eval, item->clauses , loc,
1937
1889
loopNestClauseOps, iv);
1938
1890
1939
- auto wsloopOp =
1940
- genWsloopWrapperOp (converter, semaCtx, eval, loc, wsloopClauseOps,
1941
- reductionSyms , reductionTypes);
1891
+ // TODO: Add private variables to entry block arguments.
1892
+ auto wsloopOp = genWrapperOp<mlir::omp::WsloopOp>(
1893
+ converter, loc, wsloopClauseOps , reductionTypes);
1942
1894
1943
1895
genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item,
1944
1896
loopNestClauseOps, iv, reductionSyms,
@@ -1977,7 +1929,9 @@ static void genStandaloneSimd(lower::AbstractConverter &converter,
1977
1929
genLoopNestClauses (converter, semaCtx, eval, item->clauses , loc,
1978
1930
loopNestClauseOps, iv);
1979
1931
1980
- auto simdOp = genSimdWrapperOp (converter, semaCtx, eval, loc, simdClauseOps);
1932
+ // TODO: Populate entry block arguments with reduction and private variables.
1933
+ auto simdOp = genWrapperOp<mlir::omp::SimdOp>(converter, loc, simdClauseOps,
1934
+ /* blockArgTypes=*/ {});
1981
1935
1982
1936
genLoopNestOp (converter, symTable, semaCtx, eval, loc, queue, item,
1983
1937
loopNestClauseOps, iv,
0 commit comments