[Openmp-commits] [flang] [llvm] [mlir] [openmp] [MLIR][OpenMP] Add omp.fuse operation (PR #168898)
Michael Kruse via Openmp-commits
openmp-commits at lists.llvm.org
Wed Jan 21 03:24:34 PST 2026
================
@@ -2216,6 +2218,64 @@ static void genTileOp(Fortran::lower::AbstractConverter &converter,
sizesClause.sizes);
}
+static void genFuseOp(Fortran::lower::AbstractConverter &converter,
+ Fortran::lower::SymMap &symTable,
+ lower::StatementContext &stmtCtx,
+ Fortran::semantics::SemanticsContext &semaCtx,
+ Fortran::lower::pft::Evaluation &eval, mlir::Location loc,
+ const ConstructQueue &queue,
+ ConstructQueue::const_iterator item) {
+ fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
+
+ int32_t first = 0;
+ int32_t count = 0;
+ auto iter = llvm::find_if(item->clauses, [](const Clause &clause) {
+ return clause.id == llvm::omp::Clause::OMPC_looprange;
+ });
+ if (iter != item->clauses.end()) {
+ const auto &looprange = std::get<clause::Looprange>(iter->u);
+ first = evaluate::ToInt64(std::get<0>(looprange.t)).value();
+ count = evaluate::ToInt64(std::get<1>(looprange.t)).value();
+ }
+
+ llvm::SmallVector<mlir::Value> applyees;
+ for (auto &child : eval.getNestedEvaluations()) {
+ // Skip OmpEndLoopDirective
+ if (&child == &eval.getLastNestedEvaluation())
+ break;
+ // Skip Compiler Directive
+ if (child.getIf<parser::CompilerDirective>())
+ continue;
+ // Skip the
+ // if (nested.getIf<parser::NonLabelDoStmt>())
+ // continue;
+
+ // Emit the associated loop
+ llvm::SmallVector<mlir::omp::CanonicalLoopOp> canonLoops;
+ genCanonicalLoopNest(converter, symTable, semaCtx, eval, &child, loc, queue,
+ item, 1, canonLoops);
+
+ auto cli = llvm::getSingleElement(canonLoops).getCli();
+ applyees.push_back(cli);
+ }
+ // One generated loop + one for each loop not inside the specified looprange
+ // if present
+ llvm::SmallVector<mlir::Value> generatees;
+ int64_t numGeneratees = count == 0 ? 1 : applyees.size() - count + 1;
----------------
Meinersbur wrote:
Could you add to the comment that `count==0` represents no looprange clause present.
I assume semantics checks that you cannot use `fuse(1,0)`?
[not a change request] IMHO it would have been a good idea to consider missing `looprange` somethine different than `count==0`. The latter logically would degernate to "fuse nothing". However, the OpenMP 6.0 spec says count must be positive.
https://github.com/llvm/llvm-project/pull/168898
More information about the Openmp-commits
mailing list