[Mlir-commits] [mlir] [MLIR][Affine] Fix private memref creation bug in affine fusion (PR #126028)
Uday Bondhugula
llvmlistbot at llvm.org
Thu Feb 6 22:09:43 PST 2025
================
@@ -237,29 +237,71 @@ static void sinkSequentialLoops(MemRefDependenceGraph::Node *node) {
node->op = newRootForOp;
}
+/// Get the operation that should act as a dominance filter while replacing
+/// memref uses with a private memref for which `producerStores` and
+/// `sliceInsertionBlock` are provided. This effectively determines in what
+/// part of the IR we should be performing the replacement.
+static Operation *
+getDominanceFilterForPrivateMemRefRepl(Block *sliceInsertionBlock,
+ ArrayRef<Operation *> producerStores) {
+ assert(!producerStores.empty() && "expected producer store");
+
+ // We first find the common block that contains the producer stores and
+ // the slice computation. The first ancestor among the ancestors of the
+ // producer stores in that common block is the dominance filter to use for
+ // replacement.
+ Block *commonBlock = nullptr;
+ // Find the common block of all relevant operations.
+ for (Operation *store : producerStores) {
+ if (!commonBlock)
+ commonBlock = findInnermostCommonBlockInScope(
+ store, &*sliceInsertionBlock->begin());
+ else
+ commonBlock =
+ findInnermostCommonBlockInScope(store, &*commonBlock->begin());
+ }
+ assert(commonBlock &&
+ "common block of producer stores and slice should exist");
+
+ // Find the first ancestor among the ancestors of `producerStores` in
+ // `commonBlock`.
+ Operation *firstAncestor = nullptr;
+ for (Operation *store : producerStores) {
+ Operation *ancestor = commonBlock->findAncestorOpInBlock(*store);
+ assert(ancestor && "producer store should be contained in common block");
+ firstAncestor = !firstAncestor || ancestor->isBeforeInBlock(firstAncestor)
+ ? ancestor
+ : firstAncestor;
+ }
+ return firstAncestor;
+}
+
// Creates and returns a private (single-user) memref for fused loop rooted
// at 'forOp', with (potentially reduced) memref size based on the
// MemRefRegion written to by 'srcStoreOpInst' at depth 'dstLoopDepth'.
// TODO: consider refactoring the common code from generateDma and
// this one.
-static Value createPrivateMemRef(AffineForOp forOp, Operation *srcStoreOpInst,
+static Value createPrivateMemRef(AffineForOp forOp,
----------------
bondhugula wrote:
Done.
https://github.com/llvm/llvm-project/pull/126028
More information about the Mlir-commits
mailing list