[flang-commits] [flang] [flang] Add parsing-support for IVDEP directive (PR #101045)
Mats Petersson via flang-commits
flang-commits at lists.llvm.org
Tue Jul 30 08:31:09 PDT 2024
https://github.com/Leporacanthicus updated https://github.com/llvm/llvm-project/pull/101045
>From 386c8132cd2919b456c2285a5e18f95c70e643a9 Mon Sep 17 00:00:00 2001
From: Mats Petersson <mats.petersson at arm.com>
Date: Mon, 29 Jul 2024 18:02:38 +0100
Subject: [PATCH 1/3] [flang] Add parsing-support for IVDEP directive
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.
---
flang/docs/Directives.md | 2 ++
flang/include/flang/Parser/dump-parse-tree.h | 1 +
flang/include/flang/Parser/parse-tree.h | 6 ++++--
flang/lib/Parser/Fortran-parsers.cpp | 6 +++++-
flang/lib/Parser/unparse.cpp | 3 +++
flang/test/Parser/compiler-directives.f90 | 7 +++++++
6 files changed, 22 insertions(+), 3 deletions(-)
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
>From 20b520aae02457b534173e1d19a146912da1153a Mon Sep 17 00:00:00 2001
From: Mats Petersson <mats.petersson at arm.com>
Date: Tue, 30 Jul 2024 12:11:39 +0100
Subject: [PATCH 2/3] Fix review comments
---
flang/docs/Directives.md | 2 +-
flang/lib/Parser/Fortran-parsers.cpp | 4 ++--
flang/lib/Parser/unparse.cpp | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/flang/docs/Directives.md b/flang/docs/Directives.md
index 2d70a1c4b33be..68dce0e1aee29 100644
--- a/flang/docs/Directives.md
+++ b/flang/docs/Directives.md
@@ -39,7 +39,7 @@ 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
+* `!dir$ ivdev` tells vecorization to ignore the dependency analysis of the
following loop.
# Directive Details
diff --git a/flang/lib/Parser/Fortran-parsers.cpp b/flang/lib/Parser/Fortran-parsers.cpp
index 7ae4ae474ac2e..91f8a4c984135 100644
--- a/flang/lib/Parser/Fortran-parsers.cpp
+++ b/flang/lib/Parser/Fortran-parsers.cpp
@@ -1272,7 +1272,7 @@ TYPE_PARSER(construct<StatOrErrmsg>("STAT =" >> statVariable) ||
constexpr auto ignore_tkr{
"IGNORE_TKR" >> optionalList(construct<CompilerDirective::IgnoreTKR>(
maybe(parenthesized(many(letter))), name))};
-constexpr auto ignore_vector_dep{
+constexpr auto ignoreVectorDep{
"IVDEP" >> construct<CompilerDirective::IgnoreVectorDep>()};
const constexpr auto loopCount{
"LOOP COUNT" >> construct<CompilerDirective::LoopCount>(
@@ -1286,7 +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>(ignoreVectorDep) ||
construct<CompilerDirective>(vectorAlways) ||
construct<CompilerDirective>(
many(construct<CompilerDirective::NameValue>(
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index 5b4b5adcd4953..74b9101f8a160 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -1826,7 +1826,7 @@ class UnparseVisitor {
Word("!DIR$ IGNORE_TKR"); // emitted even if tkr list is empty
Walk(" ", tkr, ", ");
},
- [&](const CompilerDirective::IgnoreVectorDep &ivdep) {
+ [&](const CompilerDirective::IgnoreVectorDep &) {
Word("!DIR$ IVDEP");
},
[&](const CompilerDirective::LoopCount &lcount) {
>From 64aa0aee16257dfb05c3f4479f17b7829201125d Mon Sep 17 00:00:00 2001
From: Mats Petersson <mats.petersson at arm.com>
Date: Tue, 30 Jul 2024 15:35:53 +0100
Subject: [PATCH 3/3] Fix minor typo missed previously
---
flang/docs/Directives.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flang/docs/Directives.md b/flang/docs/Directives.md
index 68dce0e1aee29..7fdfba068b2a9 100644
--- a/flang/docs/Directives.md
+++ b/flang/docs/Directives.md
@@ -39,7 +39,7 @@ 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 vecorization to ignore the dependency analysis of the
+* `!dir$ ivdep` tells vecorization to ignore the dependency analysis of the
following loop.
# Directive Details
More information about the flang-commits
mailing list