-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[flang][openacc] Warn only when the same variable is in the same declare #70698
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
Conversation
@llvm/pr-subscribers-flang-semantics @llvm/pr-subscribers-openacc Author: Valentin Clement (バレンタイン クレメン) (clementval) ChangesA var may appear at most once in all the clauses of declare directives for a function, subroutine, program, or module. Full diff: https://github.com/llvm/llvm-project/pull/70698.diff 3 Files Affected:
diff --git a/flang/lib/Semantics/check-acc-structure.cpp b/flang/lib/Semantics/check-acc-structure.cpp
index 763418ede24d5a7..d14098e09a8f0e8 100644
--- a/flang/lib/Semantics/check-acc-structure.cpp
+++ b/flang/lib/Semantics/check-acc-structure.cpp
@@ -401,14 +401,23 @@ void AccStructureChecker::CheckMultipleOccurrenceInDeclare(
[&](const Fortran::parser::Designator &designator) {
if (const auto *name = getDesignatorNameIfDataRef(designator)) {
if (declareSymbols.contains(&name->symbol->GetUltimate())) {
- context_.Say(GetContext().clauseSource,
- "'%s' in the %s clause is already present in another "
- "clause in this module"_err_en_US,
- name->symbol->name(),
- parser::ToUpperCaseLetters(
- llvm::acc::getOpenACCClauseName(clause).str()));
+ if (declareSymbols[&name->symbol->GetUltimate()] == clause) {
+ context_.Say(GetContext().clauseSource,
+ "'%s' in the %s clause is already present in the same "
+ "clause in this module"_warn_en_US,
+ name->symbol->name(),
+ parser::ToUpperCaseLetters(
+ llvm::acc::getOpenACCClauseName(clause).str()));
+ } else {
+ context_.Say(GetContext().clauseSource,
+ "'%s' in the %s clause is already present in another "
+ "clause in this module"_err_en_US,
+ name->symbol->name(),
+ parser::ToUpperCaseLetters(
+ llvm::acc::getOpenACCClauseName(clause).str()));
+ }
}
- declareSymbols.insert(&name->symbol->GetUltimate());
+ declareSymbols.insert({&name->symbol->GetUltimate(), clause});
}
},
[&](const Fortran::parser::Name &name) {
diff --git a/flang/lib/Semantics/check-acc-structure.h b/flang/lib/Semantics/check-acc-structure.h
index 2a09b7a39395d16..6a9aa01a9bb1333 100644
--- a/flang/lib/Semantics/check-acc-structure.h
+++ b/flang/lib/Semantics/check-acc-structure.h
@@ -18,7 +18,7 @@
#include "flang/Common/enum-set.h"
#include "flang/Parser/parse-tree.h"
#include "flang/Semantics/semantics.h"
-#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/Frontend/OpenACC/ACC.h.inc"
using AccDirectiveSet = Fortran::common::EnumSet<llvm::acc::Directive,
@@ -91,7 +91,7 @@ class AccStructureChecker
llvm::StringRef getClauseName(llvm::acc::Clause clause) override;
llvm::StringRef getDirectiveName(llvm::acc::Directive directive) override;
- llvm::SmallDenseSet<Symbol *> declareSymbols;
+ llvm::SmallDenseMap<Symbol *, llvm::acc::Clause> declareSymbols;
unsigned loopNestLevel = 0;
};
diff --git a/flang/test/Semantics/OpenACC/acc-declare-validity.f90 b/flang/test/Semantics/OpenACC/acc-declare-validity.f90
index c0333d78dd9f78b..6907e17919c93e3 100644
--- a/flang/test/Semantics/OpenACC/acc-declare-validity.f90
+++ b/flang/test/Semantics/OpenACC/acc-declare-validity.f90
@@ -14,7 +14,7 @@ module openacc_declare_validity
!$acc declare create(aa, bb)
- !ERROR: 'aa' in the CREATE clause is already present in another clause in this module
+ !WARNING: 'aa' in the CREATE clause is already present in the same clause in this module
!$acc declare create(aa)
!$acc declare link(ab)
|
@@ -14,7 +14,7 @@ module openacc_declare_validity | |||
|
|||
!$acc declare create(aa, bb) | |||
|
|||
!ERROR: 'aa' in the CREATE clause is already present in another clause in this module | |||
!WARNING: 'aa' in the CREATE clause is already present in the same clause in this module |
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 also add an error check for case when it is in conflicting declare clause again?
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.
There was on in the function but I added one back in the module declaration.
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.
Looks good - just a small suggestion.
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.
Thank you!
PR #70698 relax the duplication rule in acc declare clauses. This lead to potential duplicate creation of the global constructor/destructor. This patch make sure to not generate a duplicate ctor/dtor.
PR llvm#70698 relax the duplication rule in acc declare clauses. This lead to potential duplicate creation of the global constructor/destructor. This patch make sure to not generate a duplicate ctor/dtor.
A var may appear at most once in all the clauses of declare directives for a function, subroutine, program, or module.
We raise an error when a var appears in two different clauses. If it is in the same clauses, we just issue a warning.