[Mlir-commits] [mlir] [MLIR][Affine] Extend/generalize MDG to properly add edges between non-affine ops (PR #125451)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sun Feb 2 21:29:03 PST 2025
================
@@ -42,37 +42,88 @@ using Node = MemRefDependenceGraph::Node;
// was encountered in the loop nest.
void LoopNestStateCollector::collect(Operation *opToWalk) {
opToWalk->walk([&](Operation *op) {
- if (isa<AffineForOp>(op))
- forOps.push_back(cast<AffineForOp>(op));
- else if (op->getNumRegions() != 0 && !isa<AffineIfOp>(op))
- hasNonAffineRegionOp = true;
- else if (isa<AffineReadOpInterface>(op))
+ if (auto forOp = dyn_cast<AffineForOp>(op)) {
+ forOps.push_back(forOp);
+ } else if (isa<AffineReadOpInterface>(op)) {
loadOpInsts.push_back(op);
- else if (isa<AffineWriteOpInterface>(op))
+ } else if (isa<AffineWriteOpInterface>(op)) {
storeOpInsts.push_back(op);
+ } else {
+ auto memInterface = dyn_cast<MemoryEffectOpInterface>(op);
+ if (!memInterface) {
+ if (op->hasTrait<OpTrait::HasRecursiveMemoryEffects>())
+ // This op itself is memory-effect free.
+ return;
+ // Check operands. Eg. ops like the `call` op are handled here.
+ for (Value v : op->getOperands()) {
+ if (!isa<MemRefType>(v.getType()))
+ continue;
+ // Conservatively, we assume the memref is read and written to.
+ memrefLoads.push_back(op);
+ memrefStores.push_back(op);
+ }
+ } else {
+ // Non-affine loads and stores.
+ if (hasEffect<MemoryEffects::Read>(op))
+ memrefLoads.push_back(op);
+ if (hasEffect<MemoryEffects::Write>(op))
+ memrefStores.push_back(op);
+ if (hasEffect<MemoryEffects::Free>(op))
+ memrefFrees.push_back(op);
+ }
+ }
});
}
-// Returns the load op count for 'memref'.
unsigned Node::getLoadOpCount(Value memref) const {
unsigned loadOpCount = 0;
for (Operation *loadOp : loads) {
- if (memref == cast<AffineReadOpInterface>(loadOp).getMemRef())
+ if (auto affineLoad = dyn_cast<AffineReadOpInterface>(loadOp)) {
+ if (memref == affineLoad.getMemRef())
+ ++loadOpCount;
----------------
patel-vimal wrote:
Isn't this handled by the `else` case that follows this? Or is it just for compilation efficiency?
https://github.com/llvm/llvm-project/pull/125451
More information about the Mlir-commits
mailing list