[PATCH] D84965: [flang][OpenMP] Added initial support for lowering OpenMP parallel construct
Sourabh Singh Tomar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 31 11:30:09 PDT 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rGbf812c145ca2: [flang][OpenMP] Added initial support for lowering OpenMP parallel construct (authored by SouraVX).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84965/new/
https://reviews.llvm.org/D84965
Files:
flang/lib/Lower/OpenMP.cpp
flang/unittests/Lower/OpenMPLoweringTest.cpp
Index: flang/unittests/Lower/OpenMPLoweringTest.cpp
===================================================================
--- flang/unittests/Lower/OpenMPLoweringTest.cpp
+++ flang/unittests/Lower/OpenMPLoweringTest.cpp
@@ -71,4 +71,31 @@
EXPECT_EQ(succeeded(taskYieldOp.verify()), true);
}
+TEST_F(OpenMPLoweringTest, EmptyParallel) {
+ // Construct a dummy parse tree node for `!OMP parallel`.
+ struct Fortran::parser::OmpSimpleStandaloneDirective parallelDirective(
+ llvm::omp::Directive::OMPD_parallel);
+
+ // Check and lower the `!OMP parallel` node to `ParallelOp` operation of
+ // OpenMPDialect.
+ EXPECT_EQ(parallelDirective.v, llvm::omp::Directive::OMPD_parallel);
+ auto insertPt = mlirOpBuilder->saveInsertionPoint();
+ llvm::ArrayRef<mlir::Type> argTy;
+ mlir::ValueRange range;
+ llvm::SmallVector<int32_t, 6> operandSegmentSizes(6 /*Size=*/, 0 /*Value=*/);
+ // create and insert the operation.
+ auto parallelOp = mlirOpBuilder->create<mlir::omp::ParallelOp>(
+ mlirOpBuilder->getUnknownLoc(), argTy, range);
+ parallelOp.setAttr(mlir::omp::ParallelOp::getOperandSegmentSizeAttr(),
+ mlirOpBuilder->getI32VectorAttr(operandSegmentSizes));
+ parallelOp.getRegion().push_back(new mlir::Block{});
+ auto &block = parallelOp.getRegion().back();
+ mlirOpBuilder->setInsertionPointToStart(&block);
+ // ensure the block is well-formed.
+ mlirOpBuilder->create<mlir::omp::TerminatorOp>(
+ mlirOpBuilder->getUnknownLoc());
+ mlirOpBuilder->restoreInsertionPoint(insertPt);
+ EXPECT_EQ(succeeded(parallelOp.verify()), true);
+}
+
// main() from gtest_main
Index: flang/lib/Lower/OpenMP.cpp
===================================================================
--- flang/lib/Lower/OpenMP.cpp
+++ flang/lib/Lower/OpenMP.cpp
@@ -75,6 +75,36 @@
standaloneConstruct.u);
}
+static void
+genOMP(Fortran::lower::AbstractConverter &absConv,
+ Fortran::lower::pft::Evaluation &eval,
+ const Fortran::parser::OpenMPBlockConstruct &blockConstruct) {
+ const auto &blockDirective =
+ std::get<Fortran::parser::OmpBeginBlockDirective>(blockConstruct.t);
+ const auto ¶llelDirective =
+ std::get<Fortran::parser::OmpBlockDirective>(blockDirective.t);
+ if (parallelDirective.v == llvm::omp::OMPD_parallel) {
+ auto &firOpBuilder = absConv.getFirOpBuilder();
+ auto currentLocation = absConv.getCurrentLocation();
+ auto insertPt = firOpBuilder.saveInsertionPoint();
+ llvm::ArrayRef<mlir::Type> argTy;
+ mlir::ValueRange range;
+ llvm::SmallVector<int32_t, 6> operandSegmentSizes(6 /*Size=*/,
+ 0 /*Value=*/);
+ // create and insert the operation.
+ auto parallelOp = firOpBuilder.create<mlir::omp::ParallelOp>(
+ currentLocation, argTy, range);
+ parallelOp.setAttr(mlir::omp::ParallelOp::getOperandSegmentSizeAttr(),
+ firOpBuilder.getI32VectorAttr(operandSegmentSizes));
+ parallelOp.getRegion().push_back(new Block{});
+ auto &block = parallelOp.getRegion().back();
+ firOpBuilder.setInsertionPointToStart(&block);
+ // ensure the block is well-formed.
+ firOpBuilder.create<mlir::omp::TerminatorOp>(currentLocation);
+ firOpBuilder.restoreInsertionPoint(insertPt);
+ }
+}
+
void Fortran::lower::genOpenMPConstruct(
Fortran::lower::AbstractConverter &absConv,
Fortran::lower::pft::Evaluation &eval,
@@ -92,7 +122,7 @@
TODO();
},
[&](const Fortran::parser::OpenMPBlockConstruct &blockConstruct) {
- TODO();
+ genOMP(absConv, eval, blockConstruct);
},
[&](const Fortran::parser::OpenMPAtomicConstruct &atomicConstruct) {
TODO();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84965.282280.patch
Type: text/x-patch
Size: 3738 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200731/5d6ae699/attachment.bin>
More information about the llvm-commits
mailing list