[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