[Mlir-commits] [mlir] [MLIR][Affine] Check dependences during MDG init (PR #156422)
Uday Bondhugula
llvmlistbot at llvm.org
Tue Sep 9 01:51:26 PDT 2025
================
@@ -241,7 +242,96 @@ addNodeToMDG(Operation *nodeOp, MemRefDependenceGraph &mdg,
return &node;
}
-bool MemRefDependenceGraph::init() {
+/// Returns the memref being read/written by a memref/affine load/store op.
+static Value getMemRef(Operation *memOp) {
+ if (auto memrefLoad = dyn_cast<memref::LoadOp>(memOp))
+ return memrefLoad.getMemRef();
+ if (auto affineLoad = dyn_cast<AffineReadOpInterface>(memOp))
+ return affineLoad.getMemRef();
+ if (auto memrefStore = dyn_cast<memref::StoreOp>(memOp))
+ return memrefStore.getMemRef();
+ if (auto affineStore = dyn_cast<AffineWriteOpInterface>(memOp))
+ return affineStore.getMemRef();
+ llvm_unreachable("unexpected op");
+}
+
+/// Returns true if there may be a dependence on `memref` from srcNode's
+/// memory ops to dstNode's memory ops, while using the affine memory
+/// dependence analysis checks. The method assumes that there is at least one
+/// memory op in srcNode's loads and stores on `memref`, and similarly for
+/// `dstNode`. `srcNode.op` and `destNode.op` are expected to be nested in the
+/// same block and so the dependences are tested at the depth of that block.
+static bool mayDependence(const Node &srcNode, const Node &dstNode,
+ Value memref) {
+ assert(srcNode.op->getBlock() == dstNode.op->getBlock());
+ if (!isa<AffineForOp>(srcNode.op) || !isa<AffineForOp>(dstNode.op))
+ return true;
+
+ // Conservatively handle dependences involving non-affine load/stores. Return
+ // true if there exists a conflicting read/write access involving such.
+ auto hasNonAffineDep = [&](ArrayRef<Operation *> srcOps,
----------------
bondhugula wrote:
Sure, thanks. Changing it to `srcMemOps` and `destMemOps` and improving the comment.
https://github.com/llvm/llvm-project/pull/156422
More information about the Mlir-commits
mailing list