mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
[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 <SourabhSingh.Tomar@amd.com> Reviewed By: kiranchandramohan, NimishMishra Differential Revision: https://reviews.llvm.org/D125456
This commit is contained in:
parent
63c81b23be
commit
f305ac3d5d
@ -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<Fortran::parser::OmpClause::Schedule>(&clause.u)) {
|
||||
if (const auto &orderedClause =
|
||||
std::get_if<Fortran::parser::OmpClause::Ordered>(&clause.u)) {
|
||||
if (orderedClause->v.has_value()) {
|
||||
const auto *expr = Fortran::semantics::GetExpr(orderedClause->v);
|
||||
const std::optional<std::int64_t> 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<Fortran::parser::OmpClause::Schedule>(
|
||||
&clause.u)) {
|
||||
mlir::MLIRContext *context = firOpBuilder.getContext();
|
||||
const auto &scheduleType = scheduleClause->v;
|
||||
const auto &scheduleKind =
|
||||
|
40
flang/test/Lower/OpenMP/omp-wsloop-ordered.f90
Normal file
40
flang/test/Lower/OpenMP/omp-wsloop-ordered.f90
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user