[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