[flang] Single construct translation from PFT to FIR

This patch adds translation for single construct along with nowait
clause from PFT to FIR.

Allocate clause is added as a TODO as handleAllocateClause is added in
D122302.

Reviewed By: kiranchandramohan

Differential Revision: https://reviews.llvm.org/D122324
This commit is contained in:
Shraiysh Vaishay 2022-03-24 11:46:09 +05:30
parent 582836faaf
commit cd28353e3f
2 changed files with 62 additions and 0 deletions

View file

@ -140,6 +140,8 @@ genOMP(Fortran::lower::AbstractConverter &converter,
std::get<Fortran::parser::OmpBeginBlockDirective>(blockConstruct.t);
const auto &blockDirective =
std::get<Fortran::parser::OmpBlockDirective>(beginBlockDirective.t);
const auto &endBlockDirective =
std::get<Fortran::parser::OmpEndBlockDirective>(blockConstruct.t);
auto &firOpBuilder = converter.getFirOpBuilder();
auto currentLocation = converter.getCurrentLocation();
@ -200,6 +202,20 @@ genOMP(Fortran::lower::AbstractConverter &converter,
auto masterOp =
firOpBuilder.create<mlir::omp::MasterOp>(currentLocation, argTy);
createBodyOfOp<omp::MasterOp>(masterOp, firOpBuilder, currentLocation);
// Single Construct
} else if (blockDirective.v == llvm::omp::OMPD_single) {
mlir::UnitAttr nowaitAttr;
for (const auto &clause :
std::get<Fortran::parser::OmpClauseList>(endBlockDirective.t).v) {
if (std::get_if<Fortran::parser::OmpClause::Nowait>(&clause.u))
nowaitAttr = firOpBuilder.getUnitAttr();
// TODO: Handle allocate clause (D122302)
}
auto singleOp = firOpBuilder.create<mlir::omp::SingleOp>(
currentLocation, /*allocate_vars=*/ValueRange(),
/*allocators_vars=*/ValueRange(), nowaitAttr);
createBodyOfOp(singleOp, firOpBuilder, currentLocation);
}
}

View file

@ -0,0 +1,46 @@
!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s --check-prefixes="FIRDialect,OMPDialect"
!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | fir-opt --cfg-conversion | fir-opt --fir-to-llvm-ir | FileCheck %s --check-prefixes="OMPDialect"
!===============================================================================
! Single construct
!===============================================================================
!FIRDialect-LABEL: func @_QPomp_single
!FIRDialect-SAME: (%[[x:.*]]: !fir.ref<i32> {fir.bindc_name = "x"})
subroutine omp_single(x)
integer, intent(inout) :: x
!OMPDialect: omp.parallel
!$omp parallel
!OMPDialect: omp.single
!$omp single
!FIRDialect: %[[xval:.*]] = fir.load %[[x]] : !fir.ref<i32>
!FIRDialect: %[[res:.*]] = arith.addi %[[xval]], %{{.*}} : i32
!FIRDialect: fir.store %[[res]] to %[[x]] : !fir.ref<i32>
x = x + 12
!OMPDialect: omp.terminator
!$omp end single
!OMPDialect: omp.terminator
!$omp end parallel
end subroutine omp_single
!===============================================================================
! Single construct with nowait
!===============================================================================
!FIRDialect-LABEL: func @_QPomp_single_nowait
!FIRDialect-SAME: (%[[x:.*]]: !fir.ref<i32> {fir.bindc_name = "x"})
subroutine omp_single_nowait(x)
integer, intent(inout) :: x
!OMPDialect: omp.parallel
!$omp parallel
!OMPDialect: omp.single nowait
!$omp single
!FIRDialect: %[[xval:.*]] = fir.load %[[x]] : !fir.ref<i32>
!FIRDialect: %[[res:.*]] = arith.addi %[[xval]], %{{.*}} : i32
!FIRDialect: fir.store %[[res]] to %[[x]] : !fir.ref<i32>
x = x + 12
!OMPDialect: omp.terminator
!$omp end single nowait
!OMPDialect: omp.terminator
!$omp end parallel
end subroutine omp_single_nowait