diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp index c251d8bbdaf04..48c559a78b9bc 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()) { + 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()) { diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h index 217d7c6917bd6..e0fe917c50e8f 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 cd30bbb89ce47..2ef4d184a6321 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( + cp.processTODO( loc, llvm::omp::Directive::OMPD_task); } @@ -2869,7 +2870,8 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, !std::holds_alternative(clause.u) && !std::holds_alternative(clause.u) && !std::holds_alternative(clause.u) && - !std::holds_alternative(clause.u)) { + !std::holds_alternative(clause.u) && + !std::holds_alternative(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 cb6943073d4b3..f943abe6c591a 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) { +!CHECK: fir.call @_QPfoo() fastmath : () -> () +!CHECK: omp.terminator +!CHECK: } subroutine omp_task_detach() use omp_lib integer (kind=omp_event_handle_kind) :: event