[PATCH] D97964: [flang][OpenMP] Add semantic check for occurrence of multiple list items in aligned clause for simd directive

Arnamoy B via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 5 14:11:52 PST 2021


arnamoy10 updated this revision to Diff 328644.
arnamoy10 added a comment.

Updated code through the use of newly introduced `FindClauseMult()` function, which returns an iterator from the `multimap`, in case where multiple occurrence of a clause happens within a directive.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97964/new/

https://reviews.llvm.org/D97964

Files:
  flang/lib/Semantics/check-directive-structure.h
  flang/lib/Semantics/check-omp-structure.cpp
  flang/test/Semantics/omp-simd-aligned.f90


Index: flang/test/Semantics/omp-simd-aligned.f90
===================================================================
--- /dev/null
+++ flang/test/Semantics/omp-simd-aligned.f90
@@ -0,0 +1,37 @@
+! RUN: %S/test_errors.sh %s %t %flang -fopenmp
+
+! OpenMP Version 4.5
+! 2.8.1 simd Construct
+! Semantic error for correct test case
+
+program omp_simd
+  integer i, j, k
+  integer, allocatable :: a(:), b(:)
+
+  allocate(a(10))
+  allocate(b(10))
+
+  !ERROR: List item 'a' present at multiple ALIGNED clauses
+  !$omp simd aligned(a, a)
+  do i = 1, 10
+    a(i) = i
+  end do
+  !$omp end simd
+
+  !ERROR: List item 'a' present at multiple ALIGNED clauses
+  !$omp simd aligned(a) aligned(a)
+  do i = 1, 10
+    a(i) = i
+  end do
+  !$omp end simd
+
+  !$omp simd aligned(a) aligned(b)
+  do i = 1, 10
+    a(i) = i
+    b(i) = i
+  end do
+  !$omp end simd
+
+  print *, a
+
+end program omp_simd
Index: flang/lib/Semantics/check-omp-structure.cpp
===================================================================
--- flang/lib/Semantics/check-omp-structure.cpp
+++ flang/lib/Semantics/check-omp-structure.cpp
@@ -606,7 +606,30 @@
         }
       }
     }
-    // TODO: A list-item cannot appear in more than one aligned clause
+    // A list-item cannot appear in more than one aligned clause
+    std::set<std::string> alignedVars = {};
+    bool foundErr = false;
+    auto clauseAll = FindClauseMult(llvm::omp::Clause::OMPC_aligned);
+    for (auto itr = clauseAll.first; itr != clauseAll.second; ++itr) {
+      const auto &alignedClause{
+          std::get<parser::OmpClause::Aligned>(itr->second->u)};
+      const auto &alignedNameList{
+          std::get<std::list<parser::Name>>(alignedClause.v.t)};
+      for (auto const &var : alignedNameList) {
+        if (alignedVars.count(var.ToString()) == 1) {
+          context_.Say(
+              itr->second->source,
+              "List item '%s' present at multiple ALIGNED clauses"_err_en_US,
+              var.ToString());
+          foundErr = true;
+          break;
+        }
+        alignedVars.insert(var.ToString());
+      }
+      // Report only once for multiple error within the same directive
+      if (foundErr)
+        break;
+    }
   } // SIMD
 
   // 2.7.3 Single Construct Restriction
Index: flang/lib/Semantics/check-directive-structure.h
===================================================================
--- flang/lib/Semantics/check-directive-structure.h
+++ flang/lib/Semantics/check-directive-structure.h
@@ -205,6 +205,11 @@
     return nullptr;
   }
 
+  auto FindClauseMult(C type) {
+    auto it{GetContext().clauseInfo.equal_range(type)};
+    return it;
+  }
+
   void PushContext(const parser::CharBlock &source, D dir) {
     dirContext_.emplace_back(source, dir);
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D97964.328644.patch
Type: text/x-patch
Size: 2781 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210305/8e67a82c/attachment.bin>


More information about the llvm-commits mailing list