[flang-commits] [flang] [llvm] [mlir] [Flang][OpenMP] Support 'nowait' clause on taskwait (PR #219247)

Phoebe Linck via flang-commits flang-commits at lists.llvm.org
Mon Aug 31 09:09:23 PDT 2026


https://github.com/phi-bee updated https://github.com/llvm/llvm-project/pull/219247

>From c92f2ca49f5f7b8455403a7e25927d7e06103415 Mon Sep 17 00:00:00 2001
From: Phoebe Linck <phoebe.linck at hpe.com>
Date: Thu, 27 Aug 2026 11:12:51 -0500
Subject: [PATCH 1/2] [Flang][OpenMP] Support 'nowait' clause on taskwait

---
 flang/lib/Lower/OpenMP/OpenMP.cpp                         | 2 +-
 flang/test/Lower/OpenMP/Todo/taskwait-nowait.f90          | 8 --------
 llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h          | 4 +++-
 llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp                 | 5 +++--
 mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp              | 2 +-
 .../LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp   | 8 ++------
 mlir/test/Target/LLVMIR/openmp-taskwait-depend.mlir       | 7 +++++++
 7 files changed, 17 insertions(+), 19 deletions(-)
 delete mode 100644 flang/test/Lower/OpenMP/Todo/taskwait-nowait.f90

diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 3b121a4673c23..fa0d85b01a3e5 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -2735,7 +2735,7 @@ static void genTaskwaitClauses(lower::AbstractConverter &converter,
   lower::StatementContext stmtCtx;
   lower::SymMap &symTable = converter.getSymbolMap();
   cp.processDepend(symTable, stmtCtx, clauseOps);
-  cp.processTODO<clause::Nowait>(loc, llvm::omp::Directive::OMPD_taskwait);
+  cp.processNowait(clauseOps);
 }
 
 static void genWorkshareClauses(lower::AbstractConverter &converter,
diff --git a/flang/test/Lower/OpenMP/Todo/taskwait-nowait.f90 b/flang/test/Lower/OpenMP/Todo/taskwait-nowait.f90
deleted file mode 100644
index 21e8609b08ba3..0000000000000
--- a/flang/test/Lower/OpenMP/Todo/taskwait-nowait.f90
+++ /dev/null
@@ -1,8 +0,0 @@
-! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s -fopenmp-version=51 2>&1 | FileCheck %s
-! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s -fopenmp-version=51 2>&1 | FileCheck %s
-
-! CHECK: not yet implemented: Unhandled clause NOWAIT in TASKWAIT construct
-subroutine omp_tw_nowait
-  !$omp taskwait nowait
-end subroutine omp_tw_nowait
-
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index d65924f2a8b3b..62f186fa1bd38 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -1580,8 +1580,10 @@ class OpenMPIRBuilder {
   ///
   /// \param Loc The location where the taskwait directive was encountered.
   /// \param Dependencies dependencies as specified by the 'depend' clause.
+  /// \param IsNowait True when a 'nowait' clause is present
   LLVM_ABI void createTaskwait(const LocationDescription &Loc,
-                               DependenciesInfo Dependencies = {});
+                               DependenciesInfo Dependencies = {},
+                               bool IsNowait = false);
 
   ///  Return the LLVM struct type matching runtime `kmp_task_affinity_info_t`.
   /// `{ kmp_intptr_t base_addr; size_t len; flags (bitfield storage as i32) }`
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 1b04fc0b1c22a..d56d8c99efe00 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -2429,7 +2429,8 @@ void OpenMPIRBuilder::emitTaskwaitImpl(const LocationDescription &Loc) {
 }
 
 void OpenMPIRBuilder::createTaskwait(const LocationDescription &Loc,
-                                     DependenciesInfo Dependencies) {
+                                     DependenciesInfo Dependencies,
+                                     bool IsNowait) {
   if (!updateToLocation(Loc))
     return;
 
@@ -2468,7 +2469,7 @@ void OpenMPIRBuilder::createTaskwait(const LocationDescription &Loc,
         DepArray,
         ConstantInt::get(Builder.getInt32Ty(), 0),
         ConstantPointerNull::get(PointerType::getUnqual(M.getContext())),
-        ConstantInt::get(Builder.getInt32Ty(), false)};
+        ConstantInt::get(Builder.getInt32Ty(), IsNowait)};
     createRuntimeFunctionCall(
         getOrCreateRuntimeFunctionPtr(
             omp::RuntimeFunction::OMPRTL___kmpc_omp_taskwait_deps_51),
diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
index 85ff885f4a8f3..a3a413a1745a7 100644
--- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
+++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
@@ -5002,7 +5002,7 @@ void TaskwaitOp::build(OpBuilder &builder, OperationState &state,
       /*depend_vars=*/clauses.dependVars,
       /*depend_iterated_kinds=*/makeArrayAttr(ctx, clauses.dependIteratedKinds),
       /*depend_iterated=*/ValueRange(clauses.dependIterated),
-      /*nowait=*/nullptr);
+      /*nowait=*/clauses.nowait);
 }
 
 //===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index f5e579eaa023e..5f6930544651c 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -459,10 +459,6 @@ static LogicalResult checkImplementationStatus(Operation &op) {
       result = todo("in_reduction");
     }
   };
-  auto checkNowait = [&todo](auto op, LogicalResult &result) {
-    if (op.getNowait())
-      result = todo("nowait");
-  };
   auto checkOrder = [&todo](auto op, LogicalResult &result) {
     if (op.getOrder() || op.getOrderMod())
       result = todo("order");
@@ -571,7 +567,6 @@ static LogicalResult checkImplementationStatus(Operation &op) {
         checkAllocate(op, result);
         checkTaskReductionByref(op, result);
       })
-      .Case([&](omp::TaskwaitOp op) { checkNowait(op, result); })
       .Case([&](omp::TaskloopContextOp op) {
         checkAllocate(op, result);
         checkInReduction(op, result);
@@ -4617,7 +4612,8 @@ convertOmpTaskwaitOp(omp::TaskwaitOp twOp, llvm::IRBuilderBase &builder,
     return failure();
   }
 
-  moduleTranslation.getOpenMPBuilder()->createTaskwait(builder, dds);
+  moduleTranslation.getOpenMPBuilder()->createTaskwait(builder, dds,
+                                                       twOp.getNowait());
   if (dds.DepArray) {
     builder.CreateFree(dds.DepArray);
   }
diff --git a/mlir/test/Target/LLVMIR/openmp-taskwait-depend.mlir b/mlir/test/Target/LLVMIR/openmp-taskwait-depend.mlir
index 24a26805df618..5648320510b4a 100644
--- a/mlir/test/Target/LLVMIR/openmp-taskwait-depend.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-taskwait-depend.mlir
@@ -51,3 +51,10 @@ llvm.func @taskwait_depend_iterator(%x: !llvm.ptr) {
 // CHECK: %[[omp_global_thread_num:.+]] = call i32 @__kmpc_global_thread_num({{.+}})
 // CHECK: call void @__kmpc_omp_taskwait_deps_51(ptr @{{.+}}, i32 %[[omp_global_thread_num]], i32 10, ptr %[[dep_arr_addr]], i32 0, ptr null, i32 0)
 // CHECK: tail call void @free(ptr %[[dep_arr_addr:.+]])
+
+llvm.func @taskwait_depend_nowait(%x: !llvm.ptr) {
+  omp.taskwait depend(taskdependout -> %x : !llvm.ptr) nowait
+  llvm.return
+}
+// CHECK-LABEL: define void @taskwait_depend_nowait
+// CHECK: call void @__kmpc_omp_taskwait_deps_51(ptr @{{.+}}, i32 %{{.+}}, i32 1, ptr %{{.+}}, i32 0, ptr null, i32 1)

>From 316ec5e854ff3856198e19edeba466f1aa23a6f7 Mon Sep 17 00:00:00 2001
From: Phoebe Linck <phoebe.linck at hpe.com>
Date: Mon, 31 Aug 2026 11:08:00 -0500
Subject: [PATCH 2/2] Remove todo test

---
 mlir/test/Target/LLVMIR/openmp-todo.mlir | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/mlir/test/Target/LLVMIR/openmp-todo.mlir b/mlir/test/Target/LLVMIR/openmp-todo.mlir
index 635665c653f8d..c4ba1c81550bf 100644
--- a/mlir/test/Target/LLVMIR/openmp-todo.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-todo.mlir
@@ -627,17 +627,6 @@ llvm.func @taskloop_reduction_two_arg_init(%lb : i32, %ub : i32, %step : i32, %x
 
 // -----
 
-llvm.func @taskwait_nowait() {
-  // expected-error at below {{not yet implemented: Unhandled clause nowait in omp.taskwait operation}}
-  // expected-error at below {{LLVM Translation failed for operation: omp.taskwait}}
-  omp.taskwait nowait {
-    omp.terminator
-  }
-  llvm.return
-}
-
-// -----
-
 llvm.func @teams_allocate(%x : !llvm.ptr) {
   // expected-error at below {{not yet implemented: Unhandled clause allocate in omp.teams operation}}
   // expected-error at below {{LLVM Translation failed for operation: omp.teams}}



More information about the flang-commits mailing list