[flang-commits] [flang] [flang][OpenMP] Move two utilities from Semantics to Parser, NFC (PR #168549)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Tue Nov 18 07:21:40 PST 2025
https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/168549
Move `GetInnermostExecPart` and `IsStrictlyStructuredBlock` from Semantics/openmp-utils.* to Parser/openmp-utils.*. These two only depend on the AST contents and properties.
>From 9a58d070e06e1375ccab8945882bf67ed9c9adb6 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Mon, 17 Nov 2025 09:53:57 -0600
Subject: [PATCH] [flang][OpenMP] Move two utilities from Semantics to Parser,
NFC
Move `GetInnermostExecPart` and `IsStrictlyStructuredBlock` from
Semantics/openmp-utils.* to Parser/openmp-utils.*. These two only
depend on the AST contents and properties.
---
flang/include/flang/Parser/openmp-utils.h | 2 ++
flang/include/flang/Semantics/openmp-utils.h | 2 --
flang/lib/Parser/openmp-utils.cpp | 28 ++++++++++++++++++++
flang/lib/Semantics/check-omp-atomic.cpp | 2 ++
flang/lib/Semantics/openmp-utils.cpp | 28 --------------------
5 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h
index 8fa4a84aff06d..36556f8dd7f4a 100644
--- a/flang/include/flang/Parser/openmp-utils.h
+++ b/flang/include/flang/Parser/openmp-utils.h
@@ -137,6 +137,8 @@ const T *GetFirstArgument(const OmpDirectiveSpecification &spec) {
const BlockConstruct *GetFortranBlockConstruct(
const ExecutionPartConstruct &epc);
+const Block &GetInnermostExecPart(const Block &block);
+bool IsStrictlyStructuredBlock(const Block &block);
const OmpCombinerExpression *GetCombinerExpr(
const OmpReductionSpecifier &rspec);
diff --git a/flang/include/flang/Semantics/openmp-utils.h b/flang/include/flang/Semantics/openmp-utils.h
index 14a4f0e93bda5..f5739ab16d643 100644
--- a/flang/include/flang/Semantics/openmp-utils.h
+++ b/flang/include/flang/Semantics/openmp-utils.h
@@ -97,8 +97,6 @@ const SomeExpr *HasStorageOverlap(
const SomeExpr &base, llvm::ArrayRef<SomeExpr> exprs);
bool IsAssignment(const parser::ActionStmt *x);
bool IsPointerAssignment(const evaluate::Assignment &x);
-const parser::Block &GetInnermostExecPart(const parser::Block &block);
-bool IsStrictlyStructuredBlock(const parser::Block &block);
} // namespace omp
} // namespace Fortran::semantics
diff --git a/flang/lib/Parser/openmp-utils.cpp b/flang/lib/Parser/openmp-utils.cpp
index b9d3763cdd06d..2424828293c73 100644
--- a/flang/lib/Parser/openmp-utils.cpp
+++ b/flang/lib/Parser/openmp-utils.cpp
@@ -93,6 +93,34 @@ const BlockConstruct *GetFortranBlockConstruct(
return nullptr;
}
+/// parser::Block is a list of executable constructs, parser::BlockConstruct
+/// is Fortran's BLOCK/ENDBLOCK construct.
+/// Strip the outermost BlockConstructs, return the reference to the Block
+/// in the executable part of the innermost of the stripped constructs.
+/// Specifically, if the given `block` has a single entry (it's a list), and
+/// the entry is a BlockConstruct, get the Block contained within. Repeat
+/// this step as many times as possible.
+const Block &GetInnermostExecPart(const Block &block) {
+ const Block *iter{&block};
+ while (iter->size() == 1) {
+ const ExecutionPartConstruct &ep{iter->front()};
+ if (auto *bc{GetFortranBlockConstruct(ep)}) {
+ iter = &std::get<Block>(bc->t);
+ } else {
+ break;
+ }
+ }
+ return *iter;
+}
+
+bool IsStrictlyStructuredBlock(const Block &block) {
+ if (block.size() == 1) {
+ return GetFortranBlockConstruct(block.front()) != nullptr;
+ } else {
+ return false;
+ }
+}
+
const OmpCombinerExpression *GetCombinerExpr(
const OmpReductionSpecifier &rspec) {
return addr_if(std::get<std::optional<OmpCombinerExpression>>(rspec.t));
diff --git a/flang/lib/Semantics/check-omp-atomic.cpp b/flang/lib/Semantics/check-omp-atomic.cpp
index ec03e6fe2d920..b9e34ca6e74df 100644
--- a/flang/lib/Semantics/check-omp-atomic.cpp
+++ b/flang/lib/Semantics/check-omp-atomic.cpp
@@ -19,6 +19,7 @@
#include "flang/Evaluate/rewrite.h"
#include "flang/Evaluate/tools.h"
#include "flang/Parser/char-block.h"
+#include "flang/Parser/openmp-utils.h"
#include "flang/Parser/parse-tree.h"
#include "flang/Semantics/openmp-utils.h"
#include "flang/Semantics/symbol.h"
@@ -41,6 +42,7 @@
namespace Fortran::semantics {
+using namespace Fortran::parser::omp;
using namespace Fortran::semantics::omp;
namespace operation = Fortran::evaluate::operation;
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index 4a40d6eec17bb..18a37d64a3b5a 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -496,32 +496,4 @@ bool IsPointerAssignment(const evaluate::Assignment &x) {
return std::holds_alternative<evaluate::Assignment::BoundsSpec>(x.u) ||
std::holds_alternative<evaluate::Assignment::BoundsRemapping>(x.u);
}
-
-/// parser::Block is a list of executable constructs, parser::BlockConstruct
-/// is Fortran's BLOCK/ENDBLOCK construct.
-/// Strip the outermost BlockConstructs, return the reference to the Block
-/// in the executable part of the innermost of the stripped constructs.
-/// Specifically, if the given `block` has a single entry (it's a list), and
-/// the entry is a BlockConstruct, get the Block contained within. Repeat
-/// this step as many times as possible.
-const parser::Block &GetInnermostExecPart(const parser::Block &block) {
- const parser::Block *iter{&block};
- while (iter->size() == 1) {
- const parser::ExecutionPartConstruct &ep{iter->front()};
- if (auto *bc{GetFortranBlockConstruct(ep)}) {
- iter = &std::get<parser::Block>(bc->t);
- } else {
- break;
- }
- }
- return *iter;
-}
-
-bool IsStrictlyStructuredBlock(const parser::Block &block) {
- if (block.size() == 1) {
- return GetFortranBlockConstruct(block.front()) != nullptr;
- } else {
- return false;
- }
-}
} // namespace Fortran::semantics::omp
More information about the flang-commits
mailing list