diff options
| author | Matthias Springer <me@m-sp.org> | 2025-08-10 11:41:51 +0000 |
|---|---|---|
| committer | Matthias Springer <me@m-sp.org> | 2025-08-26 12:31:20 +0000 |
| commit | 4ce5edf8e73d8e8c850ea9fd319d3692eaf1477e (patch) | |
| tree | 6651930f08af515cd56ec0965c6991b8e3b3949f /mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp | |
| parent | 769d5c2dfb9d1bde24f915d926f8ac17ffbe29a1 (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.cpp | 34 |
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); |
