[flang-commits] [flang] [flang][OpenMP][NFC] Extract enclosing-construct trait collection helper (PR #203924)
via flang-commits
flang-commits at lists.llvm.org
Mon Jun 15 08:41:06 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Abid Qadeer (abidh)
<details>
<summary>Changes</summary>
Move the inline MLIR-parent walk in genMetadirective that maps enclosing OpenMP operations to construct trait properties into a reusable collectEnclosingConstructTraits helper. No functional change to metadirective matching; this prepares the helper for reuse by DECLARE VARIANT call-site resolution.
---
Full diff: https://github.com/llvm/llvm-project/pull/203924.diff
3 Files Affected:
- (modified) flang/lib/Lower/OpenMP/OpenMP.cpp (+1-24)
- (modified) flang/lib/Lower/OpenMP/Utils.cpp (+25)
- (modified) flang/lib/Lower/OpenMP/Utils.h (+8)
``````````diff
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 60b7fdc0e5322..87a543f66756b 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -4667,21 +4667,6 @@ struct MetadirectiveCandidate {
};
} // namespace
-static void appendConstructTraits(
- mlir::Operation *op,
- llvm::SmallVectorImpl<llvm::omp::TraitProperty> &constructTraits) {
- if (mlir::isa<mlir::omp::WsloopOp>(op))
- constructTraits.push_back(llvm::omp::TraitProperty::construct_for_for);
- if (mlir::isa<mlir::omp::ParallelOp>(op))
- constructTraits.push_back(
- llvm::omp::TraitProperty::construct_parallel_parallel);
- if (mlir::isa<mlir::omp::TeamsOp>(op))
- constructTraits.push_back(llvm::omp::TraitProperty::construct_teams_teams);
- if (mlir::isa<mlir::omp::TargetOp>(op))
- constructTraits.push_back(
- llvm::omp::TraitProperty::construct_target_target);
-}
-
static void genMetadirective(lower::AbstractConverter &converter,
lower::SymMap &symTable,
semantics::SemanticsContext &semaCtx,
@@ -4690,15 +4675,7 @@ static void genMetadirective(lower::AbstractConverter &converter,
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
llvm::SmallVector<llvm::omp::TraitProperty, 8> constructTraits;
- // Collect enclosing OpenMP operations so variants chosen by an outer
- // metadirective are part of this metadirective's context. For example, an
- // inner metadirective inside `target` and an outer-selected `parallel` must
- // be able to match construct={target, parallel}.
- for (mlir::Operation *op = builder.getInsertionBlock()->getParentOp(); op;
- op = op->getParentOp())
- appendConstructTraits(op, constructTraits);
-
- std::reverse(constructTraits.begin(), constructTraits.end());
+ collectEnclosingConstructTraits(builder, constructTraits);
FlangOMPContext ompCtx(builder.getModule(), constructTraits);
llvm::SmallVector<MetadirectiveCandidate, 4> candidates;
diff --git a/flang/lib/Lower/OpenMP/Utils.cpp b/flang/lib/Lower/OpenMP/Utils.cpp
index 6c0d343182fa9..a28cf60c5b1fc 100644
--- a/flang/lib/Lower/OpenMP/Utils.cpp
+++ b/flang/lib/Lower/OpenMP/Utils.cpp
@@ -1437,6 +1437,31 @@ bool FlangOMPContext::matchesISATrait(llvm::StringRef rawString) const {
return targetFeatures.contains(("+" + rawString).str());
}
+void collectEnclosingConstructTraits(
+ fir::FirOpBuilder &builder,
+ llvm::SmallVectorImpl<llvm::omp::TraitProperty> &constructTraits) {
+ // Collect enclosing OpenMP operations so variants chosen by an outer
+ // metadirective are part of this metadirective's context. For example, an
+ // inner metadirective inside `target` and an outer-selected `parallel` must
+ // be able to match construct={target, parallel}. The final reverse yields
+ // outermost-to-innermost order as required by OMPContext.
+ for (mlir::Operation *op = builder.getInsertionBlock()->getParentOp(); op;
+ op = op->getParentOp()) {
+ if (mlir::isa<mlir::omp::WsloopOp>(op))
+ constructTraits.push_back(llvm::omp::TraitProperty::construct_for_for);
+ if (mlir::isa<mlir::omp::ParallelOp>(op))
+ constructTraits.push_back(
+ llvm::omp::TraitProperty::construct_parallel_parallel);
+ if (mlir::isa<mlir::omp::TeamsOp>(op))
+ constructTraits.push_back(
+ llvm::omp::TraitProperty::construct_teams_teams);
+ if (mlir::isa<mlir::omp::TargetOp>(op))
+ constructTraits.push_back(
+ llvm::omp::TraitProperty::construct_target_target);
+ }
+ std::reverse(constructTraits.begin(), constructTraits.end());
+}
+
} // namespace omp
} // namespace lower
} // namespace Fortran
diff --git a/flang/lib/Lower/OpenMP/Utils.h b/flang/lib/Lower/OpenMP/Utils.h
index 678e717db54ca..bfc1d6b4764c0 100644
--- a/flang/lib/Lower/OpenMP/Utils.h
+++ b/flang/lib/Lower/OpenMP/Utils.h
@@ -256,6 +256,14 @@ std::optional<llvm::SmallVector<mlir::Value>> getIteratorElementIndices(
Fortran::lower::AbstractConverter &converter, const omp::Object &object,
Fortran::lower::StatementContext &stmtCtx, mlir::Location loc);
+/// Walk the already-emitted MLIR parent operations from the current insertion
+/// point and collect the implied OpenMP construct traits in
+/// outermost-to-innermost order. Used by metadirective lowering to build the
+/// `ConstructTraits` of an `OMPContext`.
+void collectEnclosingConstructTraits(
+ fir::FirOpBuilder &builder,
+ llvm::SmallVectorImpl<llvm::omp::TraitProperty> &constructTraits);
+
/// Non-constant user condition expression and source for runtime lowering.
struct DynamicUserCondition {
const parser::ScalarExpr *expr;
``````````
</details>
https://github.com/llvm/llvm-project/pull/203924
More information about the flang-commits
mailing list