-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[Flang][OpenMP] Add semantic checks for Worshare construct #111358
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Flang][OpenMP] Add semantic checks for Worshare construct #111358
Conversation
|
@llvm/pr-subscribers-flang-semantics @llvm/pr-subscribers-flang-openmp Author: Thirumalai Shaktivel (Thirumalai-Shaktivel) ChangesFull diff: https://github.com/llvm/llvm-project/pull/111358.diff 3 Files Affected:
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 5ef504aa72326e..890e5f8b159888 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -68,11 +68,20 @@ class OmpWorkshareBlockChecker {
if (const auto *e{GetExpr(context_, expr)}) {
for (const Symbol &symbol : evaluate::CollectSymbols(*e)) {
const Symbol &root{GetAssociationRoot(symbol)};
- if (IsFunction(root) && !IsElementalProcedure(root)) {
- context_.Say(expr.source,
- "User defined non-ELEMENTAL function "
- "'%s' is not allowed in a WORKSHARE construct"_err_en_US,
- root.name());
+ if (IsFunction(root)) {
+ std::string attrs = "";
+ if (!IsElementalProcedure(root)) {
+ attrs = " non-ELEMENTAL";
+ }
+ if (symbol.attrs().test(Attr::IMPURE)) {
+ attrs = " IMPURE" + attrs;
+ }
+ if (attrs != "") {
+ context_.Say(expr.source,
+ "User defined%s function '%s' is not allowed in a "
+ "WORKSHARE construct"_err_en_US,
+ attrs, root.name());
+ }
}
}
}
diff --git a/flang/test/Semantics/OpenMP/workshare02.f90 b/flang/test/Semantics/OpenMP/workshare02.f90
index 11f33d63a3eb80..da8fd76542a865 100644
--- a/flang/test/Semantics/OpenMP/workshare02.f90
+++ b/flang/test/Semantics/OpenMP/workshare02.f90
@@ -9,6 +9,14 @@ module my_mod
integer function my_func()
my_func = 10
end function my_func
+
+ impure integer function impure_my_func()
+ impure_my_func_ = 20
+ end function impure_my_func
+
+ impure elemental integer function impure_ele_my_func()
+ impure_ele_my_func = 20
+ end function impure_ele_my_func
end module my_mod
subroutine workshare(aa, bb, cc, dd, ee, ff, n)
@@ -61,6 +69,16 @@ subroutine workshare(aa, bb, cc, dd, ee, ff, n)
j = j - my_func()
!$omp end atomic
+ !ERROR: User defined IMPURE non-ELEMENTAL function 'impure_my_func' is not allowed in a WORKSHARE construct
+ cc = impure_my_func()
+ !ERROR: User defined IMPURE function 'impure_ele_my_func' is not allowed in a WORKSHARE construct
+ aa(1) = impure_ele_my_func()
+
!$omp end workshare
+ !$omp workshare
+ j = j + 1
+ !ERROR: At most one NOWAIT clause can appear on the END WORKSHARE directive
+ !$omp end workshare nowait nowait
+
end subroutine workshare
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index fcf087d1f9c6e4..dbcbe75458677b 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -1162,7 +1162,7 @@ def OMP_Workshare : Directive<"workshare"> {
let category = CA_Executable;
}
def OMP_EndWorkshare : Directive<"end workshare"> {
- let allowedClauses = [
+ let allowedOnceClauses = [
VersionedClause<OMPC_NoWait>,
];
let leafConstructs = OMP_Workshare.leafConstructs;
|
kiranchandramohan
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you update the summary to mention which checks you are adding? And a reference to the standard and section as well.
| "'%s' is not allowed in a WORKSHARE construct"_err_en_US, | ||
| root.name()); | ||
| if (IsFunction(root)) { | ||
| std::string attrs = ""; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use braced initialization in frontend code.
| j = j - my_func() | ||
| !$omp end atomic | ||
|
|
||
| !ERROR: User defined IMPURE non-ELEMENTAL function 'impure_my_func' is not allowed in a WORKSHARE construct |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should there be a comma?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Between the IMPURE and non-ElEMENTAL?
User defined IMPURE, non-ELEMENTAL function
e787611 to
7e687e3
Compare
7e687e3 to
f4446e4
Compare
|
I addressed the comment in the recent commit, @kiranchandramohan |
f4446e4 to
f834af1
Compare
| } | ||
| def OMP_EndWorkshare : Directive<"end workshare"> { | ||
| let allowedClauses = [ | ||
| let allowedOnceClauses = [ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: please could you add a test for this check as well. Something in flang/test/ is okay
Otherwise this LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have added a test here: https://github.com/llvm/llvm-project/pull/111358/files#diff-3b5218aa589f253f6fe3c0637625dfe6c38d9dc425d5290a626b2b6796f06db5R79-R82. Is it fine or should I move it to flang/test
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ahh my mistake
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No issues, @tblah. Thanks for the review!
tblah
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
72d5344 to
82b77c3
Compare
kiranchandramohan
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LG.
|
Thanks for the reviews. As this PR is approved, I'm merging it. |
Add missing semantic checks for Workshare construct:
OpenMP 5.2: 11.4 workshare Construct