[flang-commits] [flang] [flang][OpenMP] Use common utility functions to get affected nest depth (PR #191418)

Jason Van Beusekom via flang-commits flang-commits at lists.llvm.org
Fri Apr 10 13:10:01 PDT 2026


================
@@ -2177,116 +2159,14 @@ bool OmpAttributeVisitor::Pre(const parser::DoConstruct &x) {
   return true;
 }
 
-static bool isSizesClause(const parser::OmpClause *clause) {
-  return std::holds_alternative<parser::OmpClause::Sizes>(clause->u);
-}
-
-static bool isCollapseClause(const parser::OmpClause *clause) {
-  return std::holds_alternative<parser::OmpClause::Collapse>(clause->u);
-}
-
-std::int64_t OmpAttributeVisitor::SetAssociatedMaxClause(
-    llvm::SmallVector<std::int64_t> &levels,
-    llvm::SmallVector<const parser::OmpClause *> &clauses) {
-
-  // Find the tile level to ensure that the COLLAPSE clause value
-  // does not exeed the number of tiled loops.
-  std::int64_t tileLevel = 0;
-  for (auto [level, clause] : llvm::zip_equal(levels, clauses))
-    if (clause && isSizesClause(clause))
-      tileLevel = level;
-
-  std::int64_t maxLevel = 1;
-  const parser::OmpClause *maxClause = nullptr;
-  for (auto [level, clause] : llvm::zip_equal(levels, clauses)) {
-    if (clause && isCollapseClause(clause) && tileLevel > 0 &&
-        tileLevel < level) {
-      return 1;
-    }
-
-    if (level > maxLevel) {
-      maxLevel = level;
-      maxClause = clause;
-    }
-  }
-  if (maxClause)
-    SetAssociatedClause(maxClause);
-  return maxLevel;
-}
-
-std::int64_t OmpAttributeVisitor::GetNumAffectedLoopsFromLoopConstruct(
+int64_t OmpAttributeVisitor::GetNumAffectedLoopsFromLoopConstruct(
     const parser::OpenMPLoopConstruct &x) {
-  llvm::SmallVector<std::int64_t> levels;
-  llvm::SmallVector<const parser::OmpClause *> clauses;
-
-  CollectNumAffectedLoopsFromLoopConstruct(x, levels, clauses);
-  return SetAssociatedMaxClause(levels, clauses);
-}
-
-void OmpAttributeVisitor::CollectNumAffectedLoopsFromLoopConstruct(
-    const parser::OpenMPLoopConstruct &x,
-    llvm::SmallVector<std::int64_t> &levels,
-    llvm::SmallVector<const parser::OmpClause *> &clauses) {
-  const auto &clauseList{x.BeginDir().Clauses()};
-
-  CollectNumAffectedLoopsFromClauses(clauseList, levels, clauses);
-  CollectNumAffectedLoopsFromInnerLoopContruct(x, levels, clauses);
-
-  // OMPD_interchange with no permutation clause needs a level 2 nest
-  if (x.BeginDir().DirId() == llvm::omp::Directive::OMPD_interchange &&
-      !parser::omp::FindClause(
-          x.BeginDir(), llvm::omp::Clause::OMPC_permutation)) {
-    levels.push_back(2);
-    clauses.push_back(nullptr);
-  }
-}
-
-void OmpAttributeVisitor::CollectNumAffectedLoopsFromInnerLoopContruct(
-    const parser::OpenMPLoopConstruct &x,
-    llvm::SmallVector<std::int64_t> &levels,
-    llvm::SmallVector<const parser::OmpClause *> &clauses) {
-  for (auto &construct : std::get<parser::Block>(x.t)) {
-    if (auto *innerConstruct{parser::omp::GetOmpLoop(construct)}) {
-      CollectNumAffectedLoopsFromLoopConstruct(
-          *innerConstruct, levels, clauses);
-    }
-  }
-}
-
-void OmpAttributeVisitor::CollectNumAffectedLoopsFromClauses(
-    const parser::OmpClauseList &x, llvm::SmallVector<std::int64_t> &levels,
-    llvm::SmallVector<const parser::OmpClause *> &clauses) {
-  for (const auto &clause : x.v) {
-    if (const auto oclause{
-            std::get_if<parser::OmpClause::Ordered>(&clause.u)}) {
-      std::int64_t level = 0;
-      if (const auto v{EvaluateInt64(context_, oclause->v)}) {
-        level = *v;
-      }
-      levels.push_back(level);
-      clauses.push_back(&clause);
-    }
-
-    if (const auto cclause{
-            std::get_if<parser::OmpClause::Collapse>(&clause.u)}) {
-      std::int64_t level = 0;
-      if (const auto v{EvaluateInt64(context_, cclause->v)}) {
-        level = *v;
-      }
-      levels.push_back(level);
-      clauses.push_back(&clause);
-    }
-
-    if (const auto tclause{std::get_if<parser::OmpClause::Sizes>(&clause.u)}) {
-      levels.push_back(tclause->v.size());
-      clauses.push_back(&clause);
-    }
-    if (const auto iclause{
-            std::get_if<parser::OmpClause::Permutation>(&clause.u)}) {
-      levels.push_back(iclause->v.size());
-      clauses.push_back(&clause);
-    }
-  }
+  unsigned version{context_.langOptions().OpenMPVersion};
----------------
Jason-Van-Beusekom wrote:

Nit, 

Do we still want this in a function? Couldn't we just have this logic where we call it

https://github.com/llvm/llvm-project/pull/191418


More information about the flang-commits mailing list