[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
================
@@ -6527,6 +6527,117 @@ static void addAccessGroupMetadata(BasicBlock *Block, MDNode *AccessGroup,
}
}
+CanonicalLoopInfo *
+OpenMPIRBuilder::fuseLoops(DebugLoc DL, ArrayRef<CanonicalLoopInfo *> Loops) {
+
+ CanonicalLoopInfo *firstLoop = Loops.front();
+ CanonicalLoopInfo *lastLoop = Loops.back();
+ Function *F = firstLoop->getPreheader()->getParent();
+
+ // Loop control blocks that will become orphaned later
+ SmallVector<BasicBlock *> oldControlBBs;
+ for (CanonicalLoopInfo *Loop : Loops)
+ Loop->collectControlBlocks(oldControlBBs);
+
+ // Collect original trip counts
+ SmallVector<Value *> origTripCounts;
+ for (CanonicalLoopInfo *L : Loops) {
+ assert(L->isValid() && "All input loops must be valid canonical loops");
+ origTripCounts.push_back(L->getTripCount());
+ }
+
+ Builder.SetCurrentDebugLocation(DL);
+
+ // Compute max trip count.
+ // The fused loop will be from 0 to max(origTripCounts)
+ BasicBlock *TCBlock = BasicBlock::Create(F->getContext(), "omp.fuse.comp.tc",
+ F, firstLoop->getHeader());
+ Builder.SetInsertPoint(TCBlock);
+ Value *fusedTripCount = nullptr;
+ for (CanonicalLoopInfo *L : Loops) {
+ assert(L->isValid() && "All loops to fuse must be valid canonical loops");
+ Value *origTripCount = L->getTripCount();
+ if (!fusedTripCount) {
+ fusedTripCount = origTripCount;
+ continue;
+ }
+ Value *condTP = Builder.CreateICmpSGT(fusedTripCount, origTripCount);
+ fusedTripCount = Builder.CreateSelect(condTP, fusedTripCount, origTripCount,
+ Twine(".omp.fuse.tc"));
----------------
Meinersbur wrote:
```suggestion
".omp.fuse.tc");
```
[nit] use implicit converson
https://github.com/llvm/llvm-project/pull/168898
More information about the Openmp-commits
mailing list