[flang-commits] [flang] [flang][OpenMP] Add lowering support for task detach (PR #119128)

via flang-commits flang-commits at lists.llvm.org
Sun Dec 8 06:18:40 PST 2024


https://github.com/NimishMishra created https://github.com/llvm/llvm-project/pull/119128

This PR adds lowering task detach to MLIR.

>From 9039702ac11ea2b1efb389fec7b18c43bbd92539 Mon Sep 17 00:00:00 2001
From: Nimish Mishra <neelam.nimish at gmail.com>
Date: Sun, 8 Dec 2024 19:40:21 +0530
Subject: [PATCH] [flang] Add lowering support for task detach

---
 flang/lib/Lower/OpenMP/ClauseProcessor.cpp         | 10 ++++++++++
 flang/lib/Lower/OpenMP/ClauseProcessor.h           |  1 +
 flang/lib/Lower/OpenMP/OpenMP.cpp                  |  6 ++++--
 flang/test/Lower/OpenMP/{Todo => }/task_detach.f90 |  8 +++++---
 4 files changed, 20 insertions(+), 5 deletions(-)
 rename flang/test/Lower/OpenMP/{Todo => }/task_detach.f90 (57%)

diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index c251d8bbdaf043..5f5f0c1e30e31f 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -458,6 +458,16 @@ bool ClauseProcessor::processPriority(
   return false;
 }
 
+bool ClauseProcessor::processDetach(mlir::omp::DetachClauseOps &result) const {
+    if (auto *clause = findUniqueClause<omp::clause::Detach>()) {
+    	semantics::Symbol *sym = clause->v.sym();
+	mlir::Value symVal = converter.getSymbolAddress(*sym);
+	result.eventHandle = symVal;
+	return true;
+    }
+    	return false;
+}
+
 bool ClauseProcessor::processProcBind(
     mlir::omp::ProcBindClauseOps &result) const {
   if (auto *clause = findUniqueClause<omp::clause::ProcBind>()) {
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h
index 217d7c6917bd61..e0fe917c50e8f8 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.h
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h
@@ -90,6 +90,7 @@ class ClauseProcessor {
                           mlir::omp::ThreadLimitClauseOps &result) const;
   bool processUntied(mlir::omp::UntiedClauseOps &result) const;
 
+  bool processDetach(mlir::omp::DetachClauseOps &result) const;
   // 'Repeatable' clauses: They can appear multiple times in the clause list.
   bool processAligned(mlir::omp::AlignedClauseOps &result) const;
   bool processAllocate(mlir::omp::AllocateClauseOps &result) const;
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index cd30bbb89ce470..57bb16fcb4b94f 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1261,9 +1261,10 @@ static void genTaskClauses(lower::AbstractConverter &converter,
   cp.processMergeable(clauseOps);
   cp.processPriority(stmtCtx, clauseOps);
   cp.processUntied(clauseOps);
+  cp.processDetach(clauseOps);
   // TODO Support delayed privatization.
 
-  cp.processTODO<clause::Affinity, clause::Detach, clause::InReduction>(
+  cp.processTODO<clause::Affinity, clause::InReduction>(
       loc, llvm::omp::Directive::OMPD_task);
 }
 
@@ -2869,7 +2870,8 @@ 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::TaskReduction>(clause.u)) {
+        !std::holds_alternative<clause::TaskReduction>(clause.u) &&
+	!std::holds_alternative<clause::Detach>(clause.u)) {
       std::string name =
           parser::ToUpperCaseLetters(llvm::omp::getOpenMPClauseName(clause.id));
       TODO(clauseLocation, name + " clause is not implemented yet");
diff --git a/flang/test/Lower/OpenMP/Todo/task_detach.f90 b/flang/test/Lower/OpenMP/task_detach.f90
similarity index 57%
rename from flang/test/Lower/OpenMP/Todo/task_detach.f90
rename to flang/test/Lower/OpenMP/task_detach.f90
index cb6943073d4b3a..f943abe6c591a0 100644
--- a/flang/test/Lower/OpenMP/Todo/task_detach.f90
+++ b/flang/test/Lower/OpenMP/task_detach.f90
@@ -1,12 +1,14 @@
 ! REQUIRES: openmp_runtime
-! RUN: %not_todo_cmd bbc -emit-fir %openmp_flags -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
-! RUN: %not_todo_cmd %flang_fc1 -emit-fir %openmp_flags -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -emit-fir %openmp_flags -fopenmp -fopenmp-version=50 -o - %s | FileCheck %s
 
 !===============================================================================
 ! `detach` clause
 !===============================================================================
 
-! CHECK: not yet implemented: DETACH clause is not implemented yet
+!CHECK: omp.task detach(%[[EVENT_HANDLE:.*]] : !fir.ref<i64>) {
+!CHECK: fir.call @_QPfoo() fastmath<contract> : () -> ()
+!CHECK: omp.terminator
+!CHECK: }
 subroutine omp_task_detach()
   use omp_lib
   integer (kind=omp_event_handle_kind) :: event



More information about the flang-commits mailing list