[Mlir-commits] [mlir] [mlir][Transform] Provide a minimal set of utils that allow implementing a simple transform dialect interpreter pass (PR #68330)
Oleksandr Alex Zinenko
llvmlistbot at llvm.org
Thu Oct 5 10:50:12 PDT 2023
================
@@ -0,0 +1,84 @@
+//===- TransformInterpreterUtils.h ---------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Lightweight transform dialect interpreter utilities.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_DIALECT_TRANSFORM_TRANSFORMS_TRANSFORMINTERPRETERUTILS_H
+#define MLIR_DIALECT_TRANSFORM_TRANSFORMS_TRANSFORMINTERPRETERUTILS_H
+
+#include "mlir/Dialect/Transform/IR/TransformDialect.h"
+#include "mlir/Dialect/Transform/IR/TransformInterfaces.h"
+#include "mlir/Pass/Pass.h"
+#include "mlir/Support/LLVM.h"
+#include <memory>
+
+namespace mlir {
+struct LogicalResult;
+class MLIRContext;
+class ModuleOp;
+class Operation;
+template <typename>
+class OwningOpRef;
+class Region;
+
+namespace transform {
+namespace detail {
+/// Utility to parse and verify the content of a `transformFileName` MLIR file
+/// containing a transform dialect specification.
+LogicalResult
+parseTransformInterpreterModule(MLIRContext *context,
+ llvm::StringRef transformFileName,
+ OwningOpRef<ModuleOp> &transformModule);
+
+/// Utility to load a transform interpreter `module` from a module that has
+/// already been preloaded in the context.
+/// This mode is useful in cases where expliciit parsing of a transform library
+/// from file is expected to be prohibitively expensive.
+/// In such cases, the transform module is expected to be found in the preloaded
+/// library modules of the transform dialect.
+LogicalResult
+getPreloadedTransformInterpreterModule(MLIRContext *context,
+ OwningOpRef<ModuleOp> &module);
+
+/// Finds the first TransformOpInterface named `kTransformEntryPointSymbolName`
+/// that is either:
+/// 1. nested under `root` (takes precedence).
+/// 2. nested under `module`, if not found in `root`.
+/// Reports returns null if no such operation found.
+TransformOpInterface findTransformEntryPoint(
+ Operation *root, ModuleOp *module = nullptr,
+ StringRef entryPoint = TransformDialect::kTransformEntryPointSymbolName);
+
+/// Replaces external symbols in `block` with their (non-external) definitions
+/// from the given module.
+LogicalResult defineDeclaredSymbols(Block &block, ModuleOp definitions);
+} // namespace detail
+
+/// Standalone util to apply the named sequence `entryPoint` to the payload.
+/// This is done in 3 steps:
+/// 1. lookup the `entryPoint` symbol in `{payload, sharedTransformModule}` by
+/// calling detail::findTransformEntryPoint.
+/// 2. if the entry point is found and not nested under
+/// `sharedTransformModule`, call `detail::defineDeclaredSymbols` to "link" in
+/// the `sharedTransformModule`. Note: this may modify the transform IR
+/// embedded with the payload IR.
+/// 3. apply the transform IR to the payload IR, relaxing the requirement that
+/// the transform IR is a top-level transform op. We are applying a named
+/// sequence anyway.
+LogicalResult applyTransformNamedSequence(
+ Operation *payload,
+ const std::shared_ptr<OwningOpRef<ModuleOp>> &sharedTransformModule,
----------------
ftynse wrote:
Can this take just a ModuleOp? Const reference to shared pointer to owning reference sounds like too much, and we can get a non-const object from there anyway.
https://github.com/llvm/llvm-project/pull/68330
More information about the Mlir-commits
mailing list