From 219840fb1b31e0a40ff94548fbd2178928e8ba5f Mon Sep 17 00:00:00 2001 From: Mats Petersson Date: Mon, 29 Jul 2024 18:02:38 +0100 Subject: [PATCH 1/4] [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> t; }; + EMPTY_CLASS(IgnoreVectorDep); EMPTY_CLASS(Unrecognized); CharBlock source; - std::variant, LoopCount, std::list, - VectorAlways, std::list, Unrecognized> + std::variant, IgnoreVectorDep, LoopCount, + std::list, VectorAlways, std::list, + 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("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$ constexpr auto ignore_tkr{ "IGNORE_TKR" >> optionalList(construct( maybe(parenthesized(many(letter))), name))}; -constexpr auto loopCount{ +constexpr auto ignore_vector_dep{ + "IVDEP" >> construct()}; +const constexpr auto loopCount{ "LOOP COUNT" >> construct( parenthesized(nonemptyList(digitString64)))}; constexpr auto assumeAligned{"ASSUME_ALIGNED" >> @@ -1283,6 +1286,7 @@ TYPE_PARSER(beginDirective >> "DIR$ "_tok >> sourced((construct(ignore_tkr) || construct(loopCount) || construct(assumeAligned) || + construct(ignore_vector_dep) || construct(vectorAlways) || construct( many(construct( 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 896fbdfe587b5349e6e6a6221abe2f0864de355d Mon Sep 17 00:00:00 2001 From: Mats Petersson Date: Tue, 30 Jul 2024 12:11:39 +0100 Subject: [PATCH 2/4] 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("STAT =" >> statVariable) || constexpr auto ignore_tkr{ "IGNORE_TKR" >> optionalList(construct( maybe(parenthesized(many(letter))), name))}; -constexpr auto ignore_vector_dep{ +constexpr auto ignoreVectorDep{ "IVDEP" >> construct()}; const constexpr auto loopCount{ "LOOP COUNT" >> construct( @@ -1286,7 +1286,7 @@ TYPE_PARSER(beginDirective >> "DIR$ "_tok >> sourced((construct(ignore_tkr) || construct(loopCount) || construct(assumeAligned) || - construct(ignore_vector_dep) || + construct(ignoreVectorDep) || construct(vectorAlways) || construct( many(construct( 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 6dfa1d15644799a6a8bc343007b0d4f380974294 Mon Sep 17 00:00:00 2001 From: Mats Petersson Date: Tue, 30 Jul 2024 15:35:53 +0100 Subject: [PATCH 3/4] 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 From 89009da270ab6bfc24de85dbae61eb19c17a37ee Mon Sep 17 00:00:00 2001 From: Mats Petersson Date: Mon, 12 Aug 2024 14:33:05 +0100 Subject: [PATCH 4/4] Fix simple typo --- 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 7fdfba068b2a9..dc6db1a044dcd 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$ ivdep` tells vecorization to ignore the dependency analysis of the +* `!dir$ ivdep` tells vectorization to ignore the dependency analysis of the following loop. # Directive Details