[flang-commits] [flang] 8fdd475 - [flang][OpenMP] Add semantic checks for occurrence of nested Barrier regions

Arnamoy Bhattacharyya via flang-commits flang-commits at lists.llvm.org
Fri Jun 18 13:23:29 PDT 2021


Author: Arnamoy Bhattacharyya
Date: 2021-06-18T16:24:36-04:00
New Revision: 8fdd475c85634c4a5e5cd83d7dc15ff56c458813

URL: https://github.com/llvm/llvm-project/commit/8fdd475c85634c4a5e5cd83d7dc15ff56c458813
DIFF: https://github.com/llvm/llvm-project/commit/8fdd475c85634c4a5e5cd83d7dc15ff56c458813.diff

LOG: [flang][OpenMP] Add semantic checks for occurrence of nested Barrier regions

This patch adds the following nesting check for `barrier` constructs:

```
A barrier region may not be closely nested inside a worksharing, loop, task, taskloop, critical, ordered, atomic, or master region.
```

Also adds a test case for the check,

Reviewed By: kiranchandramohan

Differential Revision: https://reviews.llvm.org/D99888

Added: 
    flang/test/Semantics/omp-nested-barrier.f90

Modified: 
    flang/lib/Semantics/check-omp-structure.cpp
    flang/lib/Semantics/check-omp-structure.h

Removed: 
    


################################################################################
diff  --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 1ff2922671902..bc6d4a3766636 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -797,10 +797,27 @@ void OmpStructureChecker::Leave(const parser::OpenMPExecutableAllocate &x) {
   dirContext_.pop_back();
 }
 
+void OmpStructureChecker::CheckBarrierNesting(
+    const parser::OpenMPSimpleStandaloneConstruct &x) {
+  // A barrier region may not be `closely nested` inside a worksharing, loop,
+  // task, taskloop, critical, ordered, atomic, or master region.
+  // TODO:  Expand the check to include `LOOP` construct as well when it is
+  // supported.
+  if (GetContext().directive == llvm::omp::Directive::OMPD_barrier) {
+    if (IsCloselyNestedRegion(llvm::omp::nestedBarrierErrSet)) {
+      context_.Say(parser::FindSourceLocation(x),
+          "`BARRIER` region may not be closely nested inside of `WORKSHARING`, "
+          "`LOOP`, `TASK`, `TASKLOOP`,"
+          "`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region."_err_en_US);
+    }
+  }
+}
+
 void OmpStructureChecker::Enter(
     const parser::OpenMPSimpleStandaloneConstruct &x) {
   const auto &dir{std::get<parser::OmpSimpleStandaloneDirective>(x.t)};
   PushContextAndClauseSets(dir.source, dir.v);
+  CheckBarrierNesting(x);
 }
 
 void OmpStructureChecker::Leave(

diff  --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index be9de114ef21e..fcb117d7e4c40 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -96,6 +96,10 @@ static OmpDirectiveSet nestedWorkshareErrSet{
 static OmpDirectiveSet nestedMasterErrSet{
     OmpDirectiveSet{llvm::omp::Directive::OMPD_atomic} | taskGeneratingSet |
     workShareSet};
+static OmpDirectiveSet nestedBarrierErrSet{
+    OmpDirectiveSet{Directive::OMPD_critical, Directive::OMPD_ordered,
+        Directive::OMPD_atomic, Directive::OMPD_master} |
+    taskGeneratingSet | workShareSet};
 static OmpClauseSet privateSet{
     Clause::OMPC_private, Clause::OMPC_firstprivate, Clause::OMPC_lastprivate};
 static OmpClauseSet privateReductionSet{
@@ -228,6 +232,7 @@ class OmpStructureChecker
       const parser::DefinedOperator::IntrinsicOperator &);
   void CheckReductionTypeList(const parser::OmpClause::Reduction &);
   void CheckMasterNesting(const parser::OpenMPBlockConstruct &x);
+  void CheckBarrierNesting(const parser::OpenMPSimpleStandaloneConstruct &x);
   void CheckReductionArraySection(const parser::OmpObjectList &ompObjectList);
   void CheckIntentInPointerAndDefinable(
       const parser::OmpObjectList &, const llvm::omp::Clause);

diff  --git a/flang/test/Semantics/omp-nested-barrier.f90 b/flang/test/Semantics/omp-nested-barrier.f90
new file mode 100644
index 0000000000000..7b9f04d98ff88
--- /dev/null
+++ b/flang/test/Semantics/omp-nested-barrier.f90
@@ -0,0 +1,166 @@
+! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
+! OpenMP Version 4.5
+! Various checks with the nesting of BARRIER construct
+
+program omp_nest_barrier
+  integer i, k, j
+  k = 0;
+
+  !$omp do
+  do i = 1, 10
+    k = k + 1
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+
+  !$omp do simd
+  do i = 1, 10
+    k = k + 1
+    !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause.
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+
+  !$omp parallel do
+  do i = 1, 10
+    k = k + 1
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+
+  !$omp parallel do simd
+  do i = 1, 10
+    k = k + 1
+    !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause.
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+
+  !$omp parallel
+  do i = 1, 10
+    k = k + 1
+    !$omp barrier
+    j = j -1
+  end do
+  !$omp end parallel
+
+  !$omp task
+  do i = 1, 10
+    k = k + 1
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+  !$omp end task
+
+  !$omp taskloop
+  do i = 1, 10
+    k = k + 1
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+  !$omp end taskloop
+
+  !$omp critical
+  do i = 1, 10
+    k = k + 1
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+  !$omp end critical
+
+  !$omp master
+  do i = 1, 10
+    k = k + 1
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+  !$omp end master
+
+  !$omp ordered
+  do i = 1, 10
+    k = k + 1
+    !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+    !$omp barrier
+    j = j -1
+  end do
+  !$omp end ordered
+
+  !$omp ordered
+  do i = 1, 10
+    !ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
+    !$omp distribute
+    do k =1, 10
+      print *, "hello"
+      !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+      !$omp barrier
+      j = j -1
+    end do
+    !$omp end distribute
+  end do
+  !$omp end ordered
+
+  !$omp master
+  do i = 1, 10
+    !ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
+    !$omp distribute
+    do k =1, 10
+      print *, "hello"
+      !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+      !$omp barrier
+      j = j -1
+    end do
+    !$omp end distribute
+  end do
+  !$omp end master
+
+  !$omp critical
+  do i = 1, 10
+    !ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
+    !$omp distribute
+    do k =1, 10
+      print *, "hello"
+      !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+      !$omp barrier
+      j = j -1
+    end do
+    !$omp end distribute
+  end do
+  !$omp end critical
+
+  !$omp taskloop
+  do i = 1, 10
+    !ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
+    !$omp distribute
+    do k =1, 10
+      print *, "hello"
+      !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+      !$omp barrier
+      j = j -1
+    end do
+    !$omp end distribute
+  end do
+  !$omp end taskloop
+
+  !$omp task
+  do i = 1, 10
+    !ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
+    !$omp distribute
+    do k =1, 10
+      print *, "hello"
+      !ERROR: `BARRIER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`,`CRITICAL`, `ORDERED`, `ATOMIC` or `MASTER` region.
+      !$omp barrier
+      j = j -1
+    end do
+    !$omp end distribute
+  end do
+  !$omp end task
+
+end program omp_nest_barrier


        


More information about the flang-commits mailing list