OSDN Git Service

[flang][OpenMP] Added support for lowering OpenMP taskwait construct
authorSourabh Singh Tomar <SourabhSingh.Tomar@amd.com>
Thu, 16 Jul 2020 20:00:11 +0000 (01:30 +0530)
committerSourabh Singh Tomar <SourabhSingh.Tomar@amd.com>
Fri, 17 Jul 2020 14:31:54 +0000 (20:01 +0530)
Summary:
This patch lower `!OMP TASKWAIT` construct from PFT to
OpenMPDialect operations.
Construct is lowered with conformance to OpenMP 4.5 spec.

Patch is carved out of following approved PR:
https://github.com/flang-compiler/f18-llvm-project/pull/280

Reviewed By: kiranchandramohan, clementval

Differential Revision: https://reviews.llvm.org/D83983

flang/lib/Lower/OpenMP.cpp
flang/unittests/Lower/OpenMPLoweringTest.cpp

index c476f1b..e839c14 100644 (file)
@@ -35,7 +35,9 @@ static void genOMP(Fortran::lower::AbstractConverter &absConv,
         absConv.getCurrentLocation());
     break;
   case llvm::omp::Directive::OMPD_taskwait:
-    TODO();
+    absConv.getFirOpBuilder().create<mlir::omp::TaskwaitOp>(
+        absConv.getCurrentLocation());
+    break;
   case llvm::omp::Directive::OMPD_taskyield:
     TODO();
   case llvm::omp::Directive::OMPD_target_enter_data:
index 0942b9d..185d071 100644 (file)
@@ -41,4 +41,19 @@ TEST_F(OpenMPLoweringTest, Barrier) {
   EXPECT_EQ(succeeded(barrierOp.verify()), true);
 }
 
+TEST_F(OpenMPLoweringTest, TaskWait) {
+  // Construct a dummy parse tree node for `!OMP taskwait`.
+  struct Fortran::parser::OmpSimpleStandaloneDirective taskWaitDirective(
+      llvm::omp::Directive::OMPD_taskwait);
+
+  // Check and lower the `!OMP taskwait` node to `TaskwaitOp` operation of
+  // OpenMPDialect.
+  EXPECT_EQ(taskWaitDirective.v, llvm::omp::Directive::OMPD_taskwait);
+  auto taskWaitOp = mlirOpBuilder->create<mlir::omp::TaskwaitOp>(
+      mlirOpBuilder->getUnknownLoc());
+
+  EXPECT_EQ(taskWaitOp.getOperationName(), "omp.taskwait");
+  EXPECT_EQ(succeeded(taskWaitOp.verify()), true);
+}
+
 // main() from gtest_main