[flang-commits] [flang] [flang] Add parsing-support for IVDEP directive (PR #101045)

via flang-commits flang-commits at lists.llvm.org
Mon Jul 29 10:44:59 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-parser

Author: Mats Petersson (Leporacanthicus)

<details>
<summary>Changes</summary>

This adds the parser-side of the IVDEP (Ignore Vector memory DEPendencies). This still produces a warning when used at this point.

There will be a follow-up patch to implement the lowering for this, so that it passes attributes to LLVM to indicate that it should ignore memory dependencies for the vectorisation of the loop following the IVDEP directive.

---
Full diff: https://github.com/llvm/llvm-project/pull/101045.diff


6 Files Affected:

- (modified) flang/docs/Directives.md (+2) 
- (modified) flang/include/flang/Parser/dump-parse-tree.h (+1) 
- (modified) flang/include/flang/Parser/parse-tree.h (+4-2) 
- (modified) flang/lib/Parser/Fortran-parsers.cpp (+5-1) 
- (modified) flang/lib/Parser/unparse.cpp (+3) 
- (modified) flang/test/Parser/compiler-directives.f90 (+7) 


``````````diff
diff --git a/flang/docs/Directives.md b/flang/docs/Directives.md
index f356f762b13a2..2d70a1c4b33be 100644
--- a/flang/docs/Directives.md
+++ b/flang/docs/Directives.md
@@ -39,6 +39,8 @@ A list of non-standard directives supported by Flang
 * `!dir$ vector always` forces vectorization on the following loop regardless
   of cost model decisions. The loop must still be vectorizable.
   [This directive currently only works on plain do loops without labels].
+* `!dir$ ivdev` tells vecorisation to ignore the dependency analysis of the
+  following loop.
 
 # Directive Details
 
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index 37c3370b48a08..2e026e6427a6b 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -203,6 +203,7 @@ class ParseTreeDumper {
   NODE(parser, CompilerDirective)
   NODE(CompilerDirective, AssumeAligned)
   NODE(CompilerDirective, IgnoreTKR)
+  NODE(CompilerDirective, IgnoreVectorDep)
   NODE(CompilerDirective, LoopCount)
   NODE(CompilerDirective, NameValue)
   NODE(CompilerDirective, Unrecognized)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index 548fcc81984b2..660cd49224301 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -3342,10 +3342,12 @@ struct CompilerDirective {
     TUPLE_CLASS_BOILERPLATE(NameValue);
     std::tuple<Name, std::optional<std::uint64_t>> t;
   };
+  EMPTY_CLASS(IgnoreVectorDep);
   EMPTY_CLASS(Unrecognized);
   CharBlock source;
-  std::variant<std::list<IgnoreTKR>, LoopCount, std::list<AssumeAligned>,
-      VectorAlways, std::list<NameValue>, Unrecognized>
+  std::variant<std::list<IgnoreTKR>, IgnoreVectorDep, LoopCount,
+      std::list<AssumeAligned>, VectorAlways, std::list<NameValue>,
+      Unrecognized>
       u;
 };
 
diff --git a/flang/lib/Parser/Fortran-parsers.cpp b/flang/lib/Parser/Fortran-parsers.cpp
index 0bdc4c4e033c7..7ae4ae474ac2e 100644
--- a/flang/lib/Parser/Fortran-parsers.cpp
+++ b/flang/lib/Parser/Fortran-parsers.cpp
@@ -1266,12 +1266,15 @@ TYPE_PARSER(construct<StatOrErrmsg>("STAT =" >> statVariable) ||
 // Directives, extensions, and deprecated statements
 // !DIR$ IGNORE_TKR [ [(tkrdmac...)] name ]...
 // !DIR$ LOOP COUNT (n1[, n2]...)
+// !DIR$ IVDEP
 // !DIR$ name[=value] [, name[=value]]...
 // !DIR$ <anything else>
 constexpr auto ignore_tkr{
     "IGNORE_TKR" >> optionalList(construct<CompilerDirective::IgnoreTKR>(
                         maybe(parenthesized(many(letter))), name))};
-constexpr auto loopCount{
+constexpr auto ignore_vector_dep{
+    "IVDEP" >> construct<CompilerDirective::IgnoreVectorDep>()};
+const constexpr auto loopCount{
     "LOOP COUNT" >> construct<CompilerDirective::LoopCount>(
                         parenthesized(nonemptyList(digitString64)))};
 constexpr auto assumeAligned{"ASSUME_ALIGNED" >>
@@ -1283,6 +1286,7 @@ TYPE_PARSER(beginDirective >> "DIR$ "_tok >>
     sourced((construct<CompilerDirective>(ignore_tkr) ||
                 construct<CompilerDirective>(loopCount) ||
                 construct<CompilerDirective>(assumeAligned) ||
+                construct<CompilerDirective>(ignore_vector_dep) ||
                 construct<CompilerDirective>(vectorAlways) ||
                 construct<CompilerDirective>(
                     many(construct<CompilerDirective::NameValue>(
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index 2511a5dda9d09..5b4b5adcd4953 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -1826,6 +1826,9 @@ class UnparseVisitor {
               Word("!DIR$ IGNORE_TKR"); // emitted even if tkr list is empty
               Walk(" ", tkr, ", ");
             },
+            [&](const CompilerDirective::IgnoreVectorDep &ivdep) {
+              Word("!DIR$ IVDEP");
+            },
             [&](const CompilerDirective::LoopCount &lcount) {
               Walk("!DIR$ LOOP COUNT (", lcount.v, ", ", ")");
             },
diff --git a/flang/test/Parser/compiler-directives.f90 b/flang/test/Parser/compiler-directives.f90
index 246eaf985251c..3eac51b6df6d2 100644
--- a/flang/test/Parser/compiler-directives.f90
+++ b/flang/test/Parser/compiler-directives.f90
@@ -35,3 +35,10 @@ subroutine vector_always
   do i=1,10
   enddo
 end subroutine
+
+subroutine ignore_vector_dep
+  !dir$ ivdep
+  ! CHECK: !DIR$ IVDEP
+  do i=1,10
+  enddo
+end subroutine

``````````

</details>


https://github.com/llvm/llvm-project/pull/101045


More information about the flang-commits mailing list