diff --git a/mlir/include/mlir/Dialect/Affine/IR/AffineOps.h b/mlir/include/mlir/Dialect/Affine/IR/AffineOps.h --- a/mlir/include/mlir/Dialect/Affine/IR/AffineOps.h +++ b/mlir/include/mlir/Dialect/Affine/IR/AffineOps.h @@ -89,7 +89,8 @@ class AffineDmaStartOp : public Op { + OpTrait::OpInvariants, AffineMapAccessInterface::Trait, + MemoryEffectOpInterface::Trait> { public: using Op::Op; static ArrayRef getAttributeNames() { return {}; } @@ -233,6 +234,10 @@ return isSrcMemorySpaceFaster() ? 0 : getDstMemRefOperandIndex(); } + void + getEffects(SmallVectorImpl> + &effects); + static StringRef getSrcMapAttrStrName() { return "src_map"; } static StringRef getDstMapAttrStrName() { return "dst_map"; } static StringRef getTagMapAttrStrName() { return "tag_map"; } @@ -333,6 +338,9 @@ LogicalResult verifyInvariants() { return verifyInvariantsImpl(); } LogicalResult fold(ArrayRef cstOperands, SmallVectorImpl &results); + void + getEffects(SmallVectorImpl> + &effects); }; /// Returns true if the given Value can be used as a dimension id in the region diff --git a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td --- a/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td +++ b/mlir/include/mlir/Dialect/MemRef/IR/MemRefOps.td @@ -761,6 +761,17 @@ return nullptr; return getOperand(getNumOperands() - 1); } + + void getEffects( + SmallVectorImpl> & + effects) { + effects.emplace_back(MemoryEffects::Read::get(), getSrcMemRef(), + SideEffects::DefaultResource::get()); + effects.emplace_back(MemoryEffects::Write::get(), getDstMemRef(), + SideEffects::DefaultResource::get()); + effects.emplace_back(MemoryEffects::Read::get(), getTagMemRef(), + SideEffects::DefaultResource::get()); + } }]; let hasCustomAssemblyFormat = 1; let hasFolder = 1; @@ -803,6 +814,12 @@ unsigned getTagMemRefRank() { return getTagMemRef().getType().cast().getRank(); } + void getEffects( + SmallVectorImpl> & + effects) { + effects.emplace_back(MemoryEffects::Read::get(), getTagMemRef(), + SideEffects::DefaultResource::get()); + } }]; let hasFolder = 1; let hasVerifier = 1; diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp --- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp +++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp @@ -1708,6 +1708,17 @@ return memref::foldMemRefCast(*this); } +void AffineDmaStartOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), getSrcMemRef(), + SideEffects::DefaultResource::get()); + effects.emplace_back(MemoryEffects::Write::get(), getDstMemRef(), + SideEffects::DefaultResource::get()); + effects.emplace_back(MemoryEffects::Read::get(), getTagMemRef(), + SideEffects::DefaultResource::get()); +} + //===----------------------------------------------------------------------===// // AffineDmaWaitOp //===----------------------------------------------------------------------===// @@ -1786,6 +1797,13 @@ return memref::foldMemRefCast(*this); } +void AffineDmaWaitOp::getEffects( + SmallVectorImpl> + &effects) { + effects.emplace_back(MemoryEffects::Read::get(), getTagMemRef(), + SideEffects::DefaultResource::get()); +} + //===----------------------------------------------------------------------===// // AffineForOp //===----------------------------------------------------------------------===//