[Mlir-commits] [flang] [mlir] [Flang][OpenMP] Add LLVM translation support for UNTIED clause in Task (PR #121052)

Thirumalai Shaktivel llvmlistbot at llvm.org
Tue Dec 24 05:32:18 PST 2024


https://github.com/Thirumalai-Shaktivel created https://github.com/llvm/llvm-project/pull/121052

Implementation details:
The UNTIED clause is recognized by setting the flag=0 for the default
case or performing logical OR to flag if other clauses are specified,
and this flag is passed as an argument to the `__kmpc_omp_task_alloc`
runtime call.

Resubmitting the PR with fix for the failure, as it was reverted here: 927a70daf31b1610627f346b0dc140eda72144b9

>From 68fa9ebe6d73f5632381fc20af000a3a3ae3ade6 Mon Sep 17 00:00:00 2001
From: Thirumalai-Shaktivel <thirumalaishaktivel at gmail.com>
Date: Thu, 7 Nov 2024 09:25:06 +0000
Subject: [PATCH 1/4] [Flang][OpenMP] Add LLVM translation support for UNTIED
 clause in Task

Implementation details:
The UNTIED clause is recognized by setting the flag=0 for the default
case or performing logical OR to flag if other clauses are specified,
and this flag is passed as an argument to the `__kmpc_omp_task_alloc`
runtime call.
---
 flang/lib/Lower/OpenMP/OpenMP.cpp            |  1 +
 flang/test/Lower/OpenMP/Todo/task_untied.f90 | 13 -------------
 flang/test/Lower/OpenMP/task.f90             | 17 +++++++++++++++++
 mlir/test/Target/LLVMIR/openmp-llvm.mlir     | 12 ++++++++++++
 4 files changed, 30 insertions(+), 13 deletions(-)
 delete mode 100644 flang/test/Lower/OpenMP/Todo/task_untied.f90

diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index cd30bbb89ce470..06447fb4c2299e 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -2869,6 +2869,7 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
         !std::holds_alternative<clause::UseDevicePtr>(clause.u) &&
         !std::holds_alternative<clause::InReduction>(clause.u) &&
         !std::holds_alternative<clause::Mergeable>(clause.u) &&
+        !std::holds_alternative<clause::Untied>(clause.u) &&
         !std::holds_alternative<clause::TaskReduction>(clause.u)) {
       std::string name =
           parser::ToUpperCaseLetters(llvm::omp::getOpenMPClauseName(clause.id));
diff --git a/flang/test/Lower/OpenMP/Todo/task_untied.f90 b/flang/test/Lower/OpenMP/Todo/task_untied.f90
deleted file mode 100644
index 87d242ba3e9d21..00000000000000
--- a/flang/test/Lower/OpenMP/Todo/task_untied.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
-
-!===============================================================================
-! `untied` clause
-!===============================================================================
-
-! CHECK: not yet implemented: UNTIED clause is not implemented yet
-subroutine omp_task_untied()
-  !$omp task untied
-  call foo()
-  !$omp end task
-end subroutine omp_task_untied
diff --git a/flang/test/Lower/OpenMP/task.f90 b/flang/test/Lower/OpenMP/task.f90
index 6e525a044b011e..a8cc16c540c9c8 100644
--- a/flang/test/Lower/OpenMP/task.f90
+++ b/flang/test/Lower/OpenMP/task.f90
@@ -235,6 +235,10 @@ subroutine task_multiple_clauses()
   !$omp end task
 end subroutine task_multiple_clauses
 
+!===============================================================================
+! `mergeable` clause
+!===============================================================================
+
 subroutine task_mergeable()
 !CHECK: omp.task mergeable {
 !CHECK: omp.terminator
@@ -242,3 +246,16 @@ subroutine task_mergeable()
  !$omp task mergeable
  !$omp end task
 end subroutine
+
+!===============================================================================
+! `untied` clause
+!===============================================================================
+
+!CHECK-LABEL: func.func @_QPomp_task_untied() {
+subroutine omp_task_untied()
+  !CHECK: omp.task untied {
+  !$omp task untied
+    call foo()
+  !CHECK: omp.terminator
+  !$omp end task
+end subroutine omp_task_untied
diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
index 5f8bdf8afdf783..8903bf283b5c75 100644
--- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir
@@ -3020,6 +3020,18 @@ module attributes {omp.is_target_device = true} {
 
 // -----
 
+llvm.func @omp_task_untied() {
+  // The third argument is 0: which signifies the united task
+  // CHECK: {{.*}} = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %{{.*}}, i32 0,
+  // CHECK-SAME:     i64 40, i64 0, ptr @{{.*}})
+  omp.task untied {
+        omp.terminator
+  }
+  llvm.return
+}
+
+// -----
+
 // Third argument is 5: essentially (4 || 1)
 // signifying this task is TIED and MERGEABLE
 

>From 0a248e784eef8b3653f55b731792fdbd20c3ebc0 Mon Sep 17 00:00:00 2001
From: Thirumalai-Shaktivel <thirumalaishaktivel at gmail.com>
Date: Mon, 9 Dec 2024 05:29:52 +0000
Subject: [PATCH 2/4] test: Remove a todo for the task untied clause

---
 .../Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp      |  1 -
 mlir/test/Target/LLVMIR/openmp-todo.mlir              | 11 -----------
 2 files changed, 12 deletions(-)

diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 946c3c423267dd..1cd8d76c34a0cf 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -254,7 +254,6 @@ static LogicalResult checkImplementationStatus(Operation &op) {
         checkAllocate(op, result);
         checkInReduction(op, result);
         checkPriority(op, result);
-        checkUntied(op, result);
       })
       .Case([&](omp::TaskgroupOp op) {
         checkAllocate(op, result);
diff --git a/mlir/test/Target/LLVMIR/openmp-todo.mlir b/mlir/test/Target/LLVMIR/openmp-todo.mlir
index de797ea2aa3649..65c846eccb26c2 100644
--- a/mlir/test/Target/LLVMIR/openmp-todo.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-todo.mlir
@@ -458,17 +458,6 @@ llvm.func @task_priority(%x : i32) {
 
 // -----
 
-llvm.func @task_untied() {
-  // expected-error at below {{not yet implemented: Unhandled clause untied in omp.task operation}}
-  // expected-error at below {{LLVM Translation failed for operation: omp.task}}
-  omp.task untied {
-    omp.terminator
-  }
-  llvm.return
-}
-
-// -----
-
 llvm.func @taskgroup_allocate(%x : !llvm.ptr) {
   // expected-error at below {{not yet implemented: Unhandled clause allocate in omp.taskgroup operation}}
   // expected-error at below {{LLVM Translation failed for operation: omp.taskgroup}}

>From 3006a543c78d3dbaf47148f1d00b12b691d0b40f Mon Sep 17 00:00:00 2001
From: Thirumalai-Shaktivel <thirumalaishaktivel at gmail.com>
Date: Mon, 9 Dec 2024 05:32:57 +0000
Subject: [PATCH 3/4] Add a todo for taskloop untied clause

---
 .../Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp    |  4 ++++
 mlir/test/Target/LLVMIR/openmp-todo.mlir            | 13 +++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 1cd8d76c34a0cf..248248571a6f70 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -263,6 +263,10 @@ static LogicalResult checkImplementationStatus(Operation &op) {
         checkDepend(op, result);
         checkNowait(op, result);
       })
+      .Case([&](omp::TaskloopOp op) {
+        // TODO: Add other clauses check
+        checkUntied(op, result);
+      })
       .Case([&](omp::WsloopOp op) {
         checkAllocate(op, result);
         checkLinear(op, result);
diff --git a/mlir/test/Target/LLVMIR/openmp-todo.mlir b/mlir/test/Target/LLVMIR/openmp-todo.mlir
index 65c846eccb26c2..ab55a5dbd378bd 100644
--- a/mlir/test/Target/LLVMIR/openmp-todo.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-todo.mlir
@@ -510,6 +510,19 @@ llvm.func @taskloop(%lb : i32, %ub : i32, %step : i32) {
 
 // -----
 
+llvm.func @taskloop_untied(%lb : i32, %ub : i32, %step : i32) {
+  // expected-error at below {{not yet implemented: omp.taskloop}}
+  // expected-error at below {{LLVM Translation failed for operation: omp.taskloop}}
+  omp.taskloop untied {
+    omp.loop_nest (%iv) : i32 = (%lb) to (%ub) step (%step) {
+      omp.yield
+    }
+  }
+  llvm.return
+}
+
+// -----
+
 llvm.func @taskwait_depend(%x: !llvm.ptr) {
   // expected-error at below {{not yet implemented: Unhandled clause depend in omp.taskwait operation}}
   // expected-error at below {{LLVM Translation failed for operation: omp.taskwait}}

>From f58b39f0cadf14dedadfea28a26026ac2a328c7d Mon Sep 17 00:00:00 2001
From: Thirumalai-Shaktivel <thirumalaishaktivel at gmail.com>
Date: Tue, 24 Dec 2024 13:22:52 +0000
Subject: [PATCH 4/4] [OpenMP] Add a sematic check for untied task

---
 flang/lib/Semantics/check-omp-structure.cpp   | 35 +++++++++++++++++++
 flang/test/Semantics/OpenMP/task-united01.f90 | 27 ++++++++++++++
 2 files changed, 62 insertions(+)
 create mode 100644 flang/test/Semantics/OpenMP/task-united01.f90

diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 95b962f5daf57c..882f28ea1dd2f7 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -213,6 +213,31 @@ class AssociatedLoopChecker {
   std::map<std::string, std::int64_t> constructNamesAndLevels_;
 };
 
+// `OmpDesignatorChecker` is used to check if the designator
+// can appear within the OpenMP construct
+class OmpDesignatorChecker {
+public:
+  OmpDesignatorChecker(SemanticsContext &context, parser::CharBlock source)
+      : context_{context}, source_{source} {}
+
+  template <typename T> bool Pre(const T &) { return true; }
+  template <typename T> void Post(const T &) {}
+
+  bool Pre(const parser::Name &name) {
+    if (name.symbol->test(Symbol::Flag::OmpThreadprivate)) {
+      // OpenMP 6.0: 7.3 threadprivate directive restriction
+      context_.Say(source_,
+          "A THREADPRIVATE variable `%s` cannot appear in a UNTIED TASK region"_err_en_US,
+          name.source);
+    }
+    return true;
+  }
+
+private:
+  SemanticsContext &context_;
+  parser::CharBlock source_;
+};
+
 bool OmpStructureChecker::CheckAllowedClause(llvmOmpClause clause) {
   unsigned version{context_.langOptions().OpenMPVersion};
   DirectiveContext &dirCtx = GetContext();
@@ -1164,6 +1189,16 @@ void OmpStructureChecker::Enter(const parser::OpenMPBlockConstruct &x) {
     HasInvalidWorksharingNesting(
         beginDir.source, llvm::omp::nestedWorkshareErrSet);
     break;
+  case llvm::omp::Directive::OMPD_task: {
+    const auto &clauses{std::get<parser::OmpClauseList>(beginBlockDir.t)};
+    for (const auto &clause : clauses.v) {
+      if (std::get_if<parser::OmpClause::Untied>(&clause.u)) {
+        OmpDesignatorChecker ompDesignatorChecker{context_, beginDir.source};
+        parser::Walk(block, ompDesignatorChecker);
+      }
+    }
+    break;
+  }
   default:
     break;
   }
diff --git a/flang/test/Semantics/OpenMP/task-united01.f90 b/flang/test/Semantics/OpenMP/task-united01.f90
new file mode 100644
index 00000000000000..3a35f76d7c834f
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/task-united01.f90
@@ -0,0 +1,27 @@
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags
+!
+! OpenMP 5.2: 5.2 threadprivate directive restriction
+
+subroutine task_united01()
+    integer, save :: var_01, var_02(2)
+    real          :: var_03
+    common /c/ var_03
+
+    !$omp threadprivate(var_01, var_02)
+    !$omp threadprivate(/c/)
+
+    ! ERROR: A THREADPRIVATE variable `var_01` cannot appear in a UNTIED TASK region
+    ! ERROR: A THREADPRIVATE variable `var_02` cannot appear in a UNTIED TASK region
+    ! ERROR: A THREADPRIVATE variable `var_01` cannot appear in a UNTIED TASK region
+    !$omp task untied
+        var_01    = 10
+        var_02(1) = sum([var_01, 20])
+    !$omp end task
+
+    ! ERROR: A THREADPRIVATE variable `var_02` cannot appear in a UNTIED TASK region
+    ! ERROR: A THREADPRIVATE variable `var_03` cannot appear in a UNTIED TASK region
+    !$omp task untied
+        var_02(2) = product(var_02)
+        var_03    = 3.14
+    !$omp end task
+end subroutine task_united01



More information about the Mlir-commits mailing list