[flang-commits] [flang] 72f3b1c - [flang][OpenMP] Simplify handling of UserReductionDetails a bit (#159944)
via flang-commits
flang-commits at lists.llvm.org
Mon Sep 22 11:18:23 PDT 2025
Author: Krzysztof Parzyszek
Date: 2025-09-22T13:18:18-05:00
New Revision: 72f3b1c1af4b31c6b9bd86377dd017052526661e
URL: https://github.com/llvm/llvm-project/commit/72f3b1c1af4b31c6b9bd86377dd017052526661e
DIFF: https://github.com/llvm/llvm-project/commit/72f3b1c1af4b31c6b9bd86377dd017052526661e.diff
LOG: [flang][OpenMP] Simplify handling of UserReductionDetails a bit (#159944)
Instead of having a variant with specific AST nodes that can contain a
reduction specifier, simply store the OpenMPDeclarativeConstruct. It is
used to emit the source code directive when generating a module file,
and unparsing the top-level AST node will work just fine.
Added:
Modified:
flang/include/flang/Semantics/symbol.h
flang/lib/Parser/unparse.cpp
flang/lib/Semantics/mod-file.cpp
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h
index 774fc9873f7bc..e90e9c617805d 100644
--- a/flang/include/flang/Semantics/symbol.h
+++ b/flang/include/flang/Semantics/symbol.h
@@ -30,8 +30,7 @@ class raw_ostream;
}
namespace Fortran::parser {
struct Expr;
-struct OpenMPDeclareReductionConstruct;
-struct OmpMetadirectiveDirective;
+struct OpenMPDeclarativeConstruct;
}
namespace Fortran::semantics {
@@ -736,9 +735,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &, const GenericDetails &);
class UserReductionDetails {
public:
using TypeVector = std::vector<const DeclTypeSpec *>;
- using DeclInfo = std::variant<const parser::OpenMPDeclareReductionConstruct *,
- const parser::OmpMetadirectiveDirective *>;
- using DeclVector = std::vector<DeclInfo>;
+ using DeclVector = std::vector<const parser::OpenMPDeclarativeConstruct *>;
UserReductionDetails() = default;
@@ -756,7 +753,9 @@ class UserReductionDetails {
return false;
}
- void AddDecl(const DeclInfo &decl) { declList_.emplace_back(decl); }
+ void AddDecl(const parser::OpenMPDeclarativeConstruct *decl) {
+ declList_.emplace_back(decl);
+ }
const DeclVector &GetDeclList() const { return declList_; }
private:
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index c083bd073bead..cf7915886be09 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -3098,11 +3098,7 @@ template void Unparse<Expr>(llvm::raw_ostream &, const Expr &,
const common::LangOptions &, Encoding, bool, bool, preStatementType *,
AnalyzedObjectsAsFortran *);
-template void Unparse<parser::OpenMPDeclareReductionConstruct>(
- llvm::raw_ostream &, const parser::OpenMPDeclareReductionConstruct &,
- const common::LangOptions &, Encoding, bool, bool, preStatementType *,
- AnalyzedObjectsAsFortran *);
-template void Unparse<parser::OmpMetadirectiveDirective>(llvm::raw_ostream &,
- const parser::OmpMetadirectiveDirective &, const common::LangOptions &,
+template void Unparse<parser::OpenMPDeclarativeConstruct>(llvm::raw_ostream &,
+ const parser::OpenMPDeclarativeConstruct &, const common::LangOptions &,
Encoding, bool, bool, preStatementType *, AnalyzedObjectsAsFortran *);
} // namespace Fortran::parser
diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp
index 82c8536902eb2..8074c94b41e1a 100644
--- a/flang/lib/Semantics/mod-file.cpp
+++ b/flang/lib/Semantics/mod-file.cpp
@@ -1056,19 +1056,8 @@ void ModFileWriter::PutUserReduction(
// The module content for a OpenMP Declare Reduction is the OpenMP
// declaration. There may be multiple declarations.
// Decls are pointers, so do not use a reference.
- for (const auto decl : details.GetDeclList()) {
- common::visit( //
- common::visitors{//
- [&](const parser::OpenMPDeclareReductionConstruct *d) {
- Unparse(os, *d, context_.langOptions());
- },
- [&](const parser::OmpMetadirectiveDirective *m) {
- Unparse(os, *m, context_.langOptions());
- },
- [&](const auto &) {
- DIE("Unknown OpenMP DECLARE REDUCTION content");
- }},
- decl);
+ for (const auto *decl : details.GetDeclList()) {
+ Unparse(os, *decl, context_.langOptions());
}
}
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index e97f0bf02a515..73a4fc4091f5d 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1480,12 +1480,10 @@ class OmpVisitor : public virtual DeclarationVisitor {
static bool NeedsScope(const parser::OmpClause &);
bool Pre(const parser::OmpMetadirectiveDirective &x) { //
- metaDirective_ = &x;
++metaLevel_;
return true;
}
void Post(const parser::OmpMetadirectiveDirective &) { //
- metaDirective_ = nullptr;
--metaLevel_;
}
@@ -1583,7 +1581,8 @@ class OmpVisitor : public virtual DeclarationVisitor {
AddOmpSourceRange(x.source);
ProcessReductionSpecifier(
std::get<Indirection<parser::OmpReductionSpecifier>>(x.t).value(),
- std::get<std::optional<parser::OmpClauseList>>(x.t), x);
+ std::get<std::optional<parser::OmpClauseList>>(x.t),
+ declaratives_.back());
return false;
}
bool Pre(const parser::OmpMapClause &);
@@ -1692,9 +1691,11 @@ class OmpVisitor : public virtual DeclarationVisitor {
// can implicitly declare variables instead of only using the
// ones already declared in the Fortran sources.
SkipImplicitTyping(true);
+ declaratives_.push_back(&x);
return true;
}
void Post(const parser::OpenMPDeclarativeConstruct &) {
+ declaratives_.pop_back();
SkipImplicitTyping(false);
messageHandler().set_currStmtSource(std::nullopt);
}
@@ -1736,15 +1737,14 @@ class OmpVisitor : public virtual DeclarationVisitor {
private:
void ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec,
const parser::OmpClauseList &clauses);
- template <typename T>
void ProcessReductionSpecifier(const parser::OmpReductionSpecifier &spec,
const std::optional<parser::OmpClauseList> &clauses,
- const T &wholeConstruct);
+ const parser::OpenMPDeclarativeConstruct *wholeConstruct);
void ResolveCriticalName(const parser::OmpArgument &arg);
int metaLevel_{0};
- const parser::OmpMetadirectiveDirective *metaDirective_{nullptr};
+ std::vector<const parser::OpenMPDeclarativeConstruct *> declaratives_;
};
bool OmpVisitor::NeedsScope(const parser::OmpBlockConstruct &x) {
@@ -1869,11 +1869,10 @@ std::string MangleDefinedOperator(const parser::CharBlock &name) {
return "op" + name.ToString();
}
-template <typename T>
void OmpVisitor::ProcessReductionSpecifier(
const parser::OmpReductionSpecifier &spec,
const std::optional<parser::OmpClauseList> &clauses,
- const T &wholeOmpConstruct) {
+ const parser::OpenMPDeclarativeConstruct *construct) {
const parser::Name *name{nullptr};
parser::CharBlock mangledName;
UserReductionDetails reductionDetailsTemp;
@@ -1960,7 +1959,7 @@ void OmpVisitor::ProcessReductionSpecifier(
PopScope();
}
- reductionDetails->AddDecl(&wholeOmpConstruct);
+ reductionDetails->AddDecl(construct);
if (!symbol) {
symbol = &MakeSymbol(mangledName, Attrs{}, std::move(*reductionDetails));
@@ -2025,8 +2024,7 @@ bool OmpVisitor::Pre(const parser::OmpDirectiveSpecification &x) {
if (maybeArgs && maybeClauses) {
const parser::OmpArgument &first{maybeArgs->v.front()};
if (auto *spec{std::get_if<parser::OmpReductionSpecifier>(&first.u)}) {
- CHECK(metaDirective_);
- ProcessReductionSpecifier(*spec, maybeClauses, *metaDirective_);
+ ProcessReductionSpecifier(*spec, maybeClauses, declaratives_.back());
}
}
break;
More information about the flang-commits
mailing list