From f305ac3d5d0e02df68efbad42ab9c209f99d51a7 Mon Sep 17 00:00:00 2001 From: Peixin-Qiao Date: Tue, 17 May 2022 15:07:52 +0800 Subject: [PATCH] [flang][OpenMP] Support lowering to MLIR for ordered clause This supports the lowering parse-tree to MLIR for ordered clause in worksharing-loop directive. Also add the test case for operation conversion. Part of this patch is from the fir-dev branch of https://github.com/flang-compiler/f18-llvm-project. Co-authored-by: Sourabh Singh Tomar Reviewed By: kiranchandramohan, NimishMishra Differential Revision: https://reviews.llvm.org/D125456 --- flang/lib/Lower/OpenMP.cpp | 16 +++++++++-- flang/test/Lower/OpenMP/omp-wsloop-ordered.f90 | 40 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 flang/test/Lower/OpenMP/omp-wsloop-ordered.f90 diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp index 156aa89..06f546d 100644 --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -440,8 +440,20 @@ static void genOMP(Fortran::lower::AbstractConverter &converter, // Handle attribute based clauses. for (const Fortran::parser::OmpClause &clause : wsLoopOpClauseList.v) { - if (const auto &scheduleClause = - std::get_if(&clause.u)) { + if (const auto &orderedClause = + std::get_if(&clause.u)) { + if (orderedClause->v.has_value()) { + const auto *expr = Fortran::semantics::GetExpr(orderedClause->v); + const std::optional orderedClauseValue = + Fortran::evaluate::ToInt64(*expr); + wsLoopOp.ordered_valAttr( + firOpBuilder.getI64IntegerAttr(*orderedClauseValue)); + } else { + wsLoopOp.ordered_valAttr(firOpBuilder.getI64IntegerAttr(0)); + } + } else if (const auto &scheduleClause = + std::get_if( + &clause.u)) { mlir::MLIRContext *context = firOpBuilder.getContext(); const auto &scheduleType = scheduleClause->v; const auto &scheduleKind = diff --git a/flang/test/Lower/OpenMP/omp-wsloop-ordered.f90 b/flang/test/Lower/OpenMP/omp-wsloop-ordered.f90 new file mode 100644 index 0000000..7548d7a --- /dev/null +++ b/flang/test/Lower/OpenMP/omp-wsloop-ordered.f90 @@ -0,0 +1,40 @@ +! This test checks lowering of worksharing-loop construct with ordered clause. + +! RUN: bbc -fopenmp -emit-fir %s -o - | FileCheck %s + +! This checks lowering ordered clause specified without parameter +subroutine wsloop_ordered_no_para() + integer :: a(10), i + +! CHECK: omp.wsloop ordered(0) for (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) inclusive step (%{{.*}}) { +! CHECK: omp.yield +! CHECK: } + + !$omp do ordered + do i = 2, 10 + !$omp ordered + a(i) = a(i-1) + 1 + !$omp end ordered + end do + !$omp end do + +end + +! This checks lowering ordered clause specified with a parameter +subroutine wsloop_ordered_with_para() + integer :: a(10), i + +! CHECK: func @_QPwsloop_ordered_with_para() { +! CHECK: omp.wsloop ordered(1) for (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) inclusive step (%{{.*}}) { +! CHECK: omp.yield +! CHECK: } + + !$omp do ordered(1) + do i = 2, 10 + !!$omp ordered depend(sink: i-1) + a(i) = a(i-1) + 1 + !!$omp ordered depend(source) + end do + !$omp end do + +end -- 2.7.4