[flang] [llvm] [mlir] [flang][mlir][llvm][OpenMP] Add lowering and translation support for mergeable clause on task (PR #114662)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Nov 2 04:38:29 PDT 2024
https://github.com/NimishMishra created https://github.com/llvm/llvm-project/pull/114662
Add FIR generation and LLVMIR translation support for mergeable clause on task construct. A `__kmpc_task_allow_completion_event` call is emitted on the `mergeable` task, and the return value is stored in the `event_handle` (described by the mergeable clause).
>From a6929fcd163bf8c24733ae3ad81bac0ecc2e5467 Mon Sep 17 00:00:00 2001
From: Nimish Mishra <neelam.nimish at gmail.com>
Date: Sat, 2 Nov 2024 17:05:39 +0530
Subject: [PATCH] [flang][mlir][llvm][OpenMP] Add lowering and translation
support for mergeable clause on task
---
flang/lib/Lower/OpenMP/OpenMP.cpp | 4 ++--
flang/test/Lower/OpenMP/Todo/task_mergeable.f90 | 13 -------------
flang/test/Lower/OpenMP/task.f90 | 8 ++++++++
.../include/llvm/Frontend/OpenMP/OMPIRBuilder.h | 12 ++++++------
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 17 +++++++++++------
.../OpenMP/OpenMPToLLVMIRTranslation.cpp | 4 ++--
mlir/test/Target/LLVMIR/openmp-llvm.mlir | 13 +++++++++++++
mlir/test/Target/LLVMIR/openmp-todo.mlir | 11 -----------
8 files changed, 42 insertions(+), 40 deletions(-)
delete mode 100644 flang/test/Lower/OpenMP/Todo/task_mergeable.f90
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 329cbf3d7539f5..c217903624a234 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1336,8 +1336,8 @@ static void genTaskClauses(lower::AbstractConverter &converter,
cp.processUntied(clauseOps);
// TODO Support delayed privatization.
- cp.processTODO<clause::Affinity, clause::Detach, clause::InReduction,
- clause::Mergeable>(loc, llvm::omp::Directive::OMPD_task);
+ cp.processTODO<clause::Affinity, clause::Detach, clause::InReduction>(
+ loc, llvm::omp::Directive::OMPD_task);
}
static void genTaskgroupClauses(lower::AbstractConverter &converter,
diff --git a/flang/test/Lower/OpenMP/Todo/task_mergeable.f90 b/flang/test/Lower/OpenMP/Todo/task_mergeable.f90
deleted file mode 100644
index ddc27487abfe9c..00000000000000
--- a/flang/test/Lower/OpenMP/Todo/task_mergeable.f90
+++ /dev/null
@@ -1,13 +0,0 @@
-! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
-! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
-
-!===============================================================================
-! `mergeable` clause
-!===============================================================================
-
-! CHECK: not yet implemented: Unhandled clause MERGEABLE in TASK construct
-subroutine omp_task_mergeable()
- !$omp task mergeable
- call foo()
- !$omp end task
-end subroutine omp_task_mergeable
diff --git a/flang/test/Lower/OpenMP/task.f90 b/flang/test/Lower/OpenMP/task.f90
index 4f00f261fe57df..27cc379ba0d463 100644
--- a/flang/test/Lower/OpenMP/task.f90
+++ b/flang/test/Lower/OpenMP/task.f90
@@ -245,3 +245,11 @@ subroutine task_multiple_clauses()
!CHECK: omp.terminator
!$omp end task
end subroutine task_multiple_clauses
+
+subroutine task_mergeable()
+!CHECK: omp.task mergeable {
+!CHECK: omp.terminator
+!CHECK: }
+ !$omp task mergeable
+ !$omp end task
+end subroutine
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index 3afb9d84278e81..a97deafa3683cf 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -1262,12 +1262,12 @@ class OpenMPIRBuilder {
/// cannot be resumed until execution of the structured
/// block that is associated with the generated task is
/// completed.
- InsertPointOrErrorTy createTask(const LocationDescription &Loc,
- InsertPointTy AllocaIP,
- BodyGenCallbackTy BodyGenCB, bool Tied = true,
- Value *Final = nullptr,
- Value *IfCondition = nullptr,
- SmallVector<DependData> Dependencies = {});
+ /// \param Mergeable If the given task is `mergeable`
+ InsertPointOrErrorTy
+ createTask(const LocationDescription &Loc, InsertPointTy AllocaIP,
+ BodyGenCallbackTy BodyGenCB, bool Tied = true,
+ Value *Final = nullptr, Value *IfCondition = nullptr,
+ SmallVector<DependData> Dependencies = {}, bool Mergeable = false);
/// Generator for the taskgroup construct
///
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index d2e4dc1c85dfd2..d5d5a39897229d 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -1816,11 +1816,10 @@ static Value *emitTaskDependencies(
return DepArray;
}
-OpenMPIRBuilder::InsertPointOrErrorTy
-OpenMPIRBuilder::createTask(const LocationDescription &Loc,
- InsertPointTy AllocaIP, BodyGenCallbackTy BodyGenCB,
- bool Tied, Value *Final, Value *IfCondition,
- SmallVector<DependData> Dependencies) {
+OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTask(
+ const LocationDescription &Loc, InsertPointTy AllocaIP,
+ BodyGenCallbackTy BodyGenCB, bool Tied, Value *Final, Value *IfCondition,
+ SmallVector<DependData> Dependencies, bool Mergeable) {
if (!updateToLocation(Loc))
return InsertPointTy();
@@ -1866,7 +1865,8 @@ OpenMPIRBuilder::createTask(const LocationDescription &Loc,
Builder, AllocaIP, ToBeDeleted, TaskAllocaIP, "global.tid", false));
OI.PostOutlineCB = [this, Ident, Tied, Final, IfCondition, Dependencies,
- TaskAllocaBB, ToBeDeleted](Function &OutlinedFn) mutable {
+ Mergeable, TaskAllocaBB,
+ ToBeDeleted](Function &OutlinedFn) mutable {
// Replace the Stale CI by appropriate RTL function call.
assert(OutlinedFn.getNumUses() == 1 &&
"there must be a single user for the outlined function");
@@ -1891,6 +1891,8 @@ OpenMPIRBuilder::createTask(const LocationDescription &Loc,
// Task is untied iff (Flags & 1) == 0.
// Task is final iff (Flags & 2) == 2.
// Task is not final iff (Flags & 2) == 0.
+ // Task is mergeable iff (Flags & 4) == 4.
+ // Task is not mergeable iff (Flags & 4) == 0.
// TODO: Handle the other flags.
Value *Flags = Builder.getInt32(Tied);
if (Final) {
@@ -1899,6 +1901,9 @@ OpenMPIRBuilder::createTask(const LocationDescription &Loc,
Flags = Builder.CreateOr(FinalFlag, Flags);
}
+ if (Mergeable)
+ Flags = Builder.CreateOr(Builder.getInt32(4), Flags);
+
// Argument - `sizeof_kmp_task_t` (TaskSize)
// Tasksize refers to the size in bytes of kmp_task_t data structure
// including private vars accessed in task.
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index dca29f55661b0c..5e9f9c341e215d 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -255,7 +255,6 @@ static LogicalResult checkImplementationStatus(Operation &op) {
.Case([&](omp::TaskOp op) {
checkAllocate(op, result);
checkInReduction(op, result);
- checkMergeable(op, result);
checkPriority(op, result);
checkPrivate(op, result);
checkUntied(op, result);
@@ -1507,7 +1506,8 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
moduleTranslation.getOpenMPBuilder()->createTask(
ompLoc, allocaIP, bodyCB, !taskOp.getUntied(),
moduleTranslation.lookupValue(taskOp.getFinal()),
- moduleTranslation.lookupValue(taskOp.getIfExpr()), dds);
+ moduleTranslation.lookupValue(taskOp.getIfExpr()), dds,
+ taskOp.getMergeable());
if (failed(handleError(afterIP, *taskOp)))
return failure();
diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
index 49f9f3562c78b5..c477e983f0a1b6 100644
--- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
@@ -2952,6 +2952,19 @@ module attributes {omp.is_target_device = true} {
// -----
+// Third argument is 5: essentially (4 || 1)
+// signifying this task is TIED and MERGEABLE
+
+// CHECK: {{.*}} = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %omp_global_thread_num, i32 5, i64 40, i64 0, ptr @omp_task_mergeable..omp_par)
+llvm.func @omp_task_mergeable() {
+ omp.task mergeable {
+ omp.terminator
+ }
+ llvm.return
+}
+
+// -----
+
llvm.func external @foo_before() -> ()
llvm.func external @foo() -> ()
llvm.func external @foo_after() -> ()
diff --git a/mlir/test/Target/LLVMIR/openmp-todo.mlir b/mlir/test/Target/LLVMIR/openmp-todo.mlir
index 3c9bd9031c3e85..4fa857c9ed1a6c 100644
--- a/mlir/test/Target/LLVMIR/openmp-todo.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-todo.mlir
@@ -447,17 +447,6 @@ llvm.func @task_in_reduction(%x : !llvm.ptr) {
// -----
-llvm.func @task_mergeable() {
- // expected-error at below {{mergeable clause not yet supported}}
- // expected-error at below {{LLVM Translation failed for operation: omp.task}}
- omp.task mergeable {
- omp.terminator
- }
- llvm.return
-}
-
-// -----
-
llvm.func @task_priority(%x : i32) {
// expected-error at below {{priority clause not yet supported}}
// expected-error at below {{LLVM Translation failed for operation: omp.task}}
More information about the llvm-commits
mailing list