[flang-commits] [flang] cd28353 - [flang] Single construct translation from PFT to FIR
Shraiysh Vaishay via flang-commits
flang-commits at lists.llvm.org
Wed Mar 23 23:30:56 PDT 2022
Author: Shraiysh Vaishay
Date: 2022-03-24T12:00:44+05:30
New Revision: cd28353e3f5a206d118b5fdd0a09733d5596e0ef
URL: https://github.com/llvm/llvm-project/commit/cd28353e3f5a206d118b5fdd0a09733d5596e0ef
DIFF: https://github.com/llvm/llvm-project/commit/cd28353e3f5a206d118b5fdd0a09733d5596e0ef.diff
LOG: [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
Added:
flang/test/Lower/OpenMP/single.f90
Modified:
flang/lib/Lower/OpenMP.cpp
Removed:
################################################################################
diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp
index 4ca8cc709d040..8aeca2769bde1 100644
--- a/flang/lib/Lower/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP.cpp
@@ -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);
}
}
diff --git a/flang/test/Lower/OpenMP/single.f90 b/flang/test/Lower/OpenMP/single.f90
new file mode 100644
index 0000000000000..5d00bdd0897c7
--- /dev/null
+++ b/flang/test/Lower/OpenMP/single.f90
@@ -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
More information about the flang-commits
mailing list