summaryrefslogtreecommitdiff
path: root/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
diff options
context:
space:
mode:
authorMatthias Springer <me@m-sp.org>2025-08-10 11:41:51 +0000
committerMatthias Springer <me@m-sp.org>2025-08-26 12:31:20 +0000
commit4ce5edf8e73d8e8c850ea9fd319d3692eaf1477e (patch)
tree6651930f08af515cd56ec0965c6991b8e3b3949f /mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
parent769d5c2dfb9d1bde24f915d926f8ac17ffbe29a1 (diff)
[mlir][linalg] Migrate Detensorize pass to new dialect conversion driverusers/matthias-springer/migrate_detensorize
Diffstat (limited to 'mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp')
-rw-r--r--mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp b/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
index 830905495e75..221f95a8d8f3 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
@@ -458,6 +458,22 @@ struct LinalgDetensorize
}
};
+ /// A listener that forwards notifyBlockErased and notifyOperationErased to
+ /// the given callbacks.
+ struct CallbackListener : public RewriterBase::Listener {
+ CallbackListener(std::function<void(Operation *op)> onOperationErased,
+ std::function<void(Block *block)> onBlockErased)
+ : onOperationErased(onOperationErased), onBlockErased(onBlockErased) {}
+
+ void notifyBlockErased(Block *block) override { onBlockErased(block); }
+ void notifyOperationErased(Operation *op) override {
+ onOperationErased(op);
+ }
+
+ std::function<void(Operation *op)> onOperationErased;
+ std::function<void(Block *block)> onBlockErased;
+ };
+
void runOnOperation() override {
MLIRContext *context = &getContext();
DetensorizeTypeConverter typeConverter;
@@ -551,8 +567,22 @@ struct LinalgDetensorize
populateBranchOpInterfaceTypeConversionPattern(patterns, typeConverter,
shouldConvertBranchOperand);
- if (failed(
- applyFullConversion(getOperation(), target, std::move(patterns))))
+ ConversionConfig config;
+ auto onOperationErased = [&](Operation *op) {
+ opsToDetensor.erase(op);
+ detensorableBranchOps.erase(op);
+ };
+ auto onBlockErased = [&](Block *block) {
+ for (BlockArgument arg : block->getArguments()) {
+ blockArgsToDetensor.erase(arg);
+ }
+ };
+ CallbackListener listener(onOperationErased, onBlockErased);
+
+ config.listener = &listener;
+ config.allowPatternRollback = false;
+ if (failed(applyFullConversion(getOperation(), target, std::move(patterns),
+ config)))
signalPassFailure();
RewritePatternSet canonPatterns(context);