[Mlir-commits] [mlir] [MLIR][Python] Support Python-defined rewrite patterns (PR #162699)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Oct 10 18:19:23 PDT 2025
================
@@ -165,13 +175,116 @@ class PyFrozenRewritePatternSet {
MlirFrozenRewritePatternSet set;
};
+class PyRewritePatternSet {
+public:
+ PyRewritePatternSet(MlirContext ctx)
+ : set(mlirRewritePatternSetCreate(ctx)), ctx(ctx) {}
+ ~PyRewritePatternSet() {
+ if (set.ptr)
+ mlirRewritePatternSetDestroy(set);
+ }
+
+ void add(MlirStringRef rootName, unsigned benefit,
+ const nb::callable &matchAndRewrite) {
+ MlirRewritePatternCallbacks callbacks;
+ callbacks.construct = [](void *userData) {
+ nb::handle(static_cast<PyObject *>(userData)).inc_ref();
+ };
+ callbacks.destruct = [](void *userData) {
+ nb::handle(static_cast<PyObject *>(userData)).dec_ref();
+ };
+ callbacks.matchAndRewrite = [](MlirRewritePattern pattern, MlirOperation op,
+ MlirPatternRewriter rewriter,
+ void *userData) -> MlirLogicalResult {
+ nb::handle f(static_cast<PyObject *>(userData));
+ nb::object res = f(op, PyPatternRewriter(rewriter), pattern);
----------------
PragmaTwice wrote:
Currently it is useless. There is no attribute/method defined inside `pattern` so we cannot use it in Python. I just thought that, if in the future we add some method to make it useful, we don't need to add a new argument to the callback to break users' code. So it is to mainly avoid breaking changes. And yeah I also don't know if there is some case that these Pattern APIs are necessary. 🤣
https://github.com/llvm/llvm-project/pull/162699
More information about the Mlir-commits
mailing list