diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp index 156aa89c1562..06f546d45327 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 000000000000..7548d7a59722 --- /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