Updating HAL passes to use tablegen. (#15952)
No functional changes, just boilerplate churn from C++ to tablegen and
other cleanup.
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.cpp b/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.cpp
index 4860b91..2bac06c 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.cpp
@@ -130,3 +130,34 @@
}
} // namespace mlir::iree_compiler::IREE::HAL
+
+namespace llvm::cl {
+template class basic_parser<TargetBackendRegistryRef>;
+} // namespace llvm::cl
+
+using TargetBackendRegistryRef = llvm::cl::TargetBackendRegistryRef;
+
+// Return true on error.
+bool llvm::cl::parser<TargetBackendRegistryRef>::parse(
+ Option &O, StringRef ArgName, StringRef Arg,
+ TargetBackendRegistryRef &Val) {
+ // We ignore Arg here and just use the global registry. We could parse a list
+ // of target backends and create a new registry with just that subset but
+ // ownership gets tricky.
+ if (Arg != "global")
+ return true;
+ Val.value =
+ &mlir::iree_compiler::IREE::HAL::TargetBackendRegistry::getGlobal();
+ return false;
+}
+
+void llvm::cl::parser<TargetBackendRegistryRef>::printOptionDiff(
+ const Option &O, TargetBackendRegistryRef V, const OptVal &Default,
+ size_t GlobalWidth) const {
+ printOptionName(O, GlobalWidth);
+ std::string Str = "global";
+ outs() << "= " << Str;
+ outs().indent(2) << " (default: global)\n";
+}
+
+void llvm::cl::parser<TargetBackendRegistryRef>::anchor() {}
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.h b/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.h
index 6927c13..07f933d 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.h
+++ b/compiler/src/iree/compiler/Dialect/HAL/Target/TargetRegistry.h
@@ -15,6 +15,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/CommandLine.h"
namespace mlir::iree_compiler::IREE::HAL {
@@ -96,4 +97,44 @@
} // namespace mlir::iree_compiler::IREE::HAL
+namespace llvm::cl {
+
+struct TargetBackendRegistryRef {
+ const mlir::iree_compiler::IREE::HAL::TargetBackendRegistry *value =
+ &mlir::iree_compiler::IREE::HAL::TargetBackendRegistry::getGlobal();
+ TargetBackendRegistryRef() = default;
+ TargetBackendRegistryRef(
+ const mlir::iree_compiler::IREE::HAL::TargetBackendRegistry &value)
+ : value(&value) {}
+ TargetBackendRegistryRef(
+ const mlir::iree_compiler::IREE::HAL::TargetBackendRegistry *value)
+ : value(value) {}
+ operator bool() const noexcept {
+ return value->getRegisteredTargetBackends() !=
+ mlir::iree_compiler::IREE::HAL::TargetBackendRegistry::getGlobal()
+ .getRegisteredTargetBackends();
+ }
+ const mlir::iree_compiler::IREE::HAL::TargetBackendRegistry *
+ operator->() const {
+ return value;
+ }
+};
+
+extern template class basic_parser<TargetBackendRegistryRef>;
+
+template <>
+class parser<TargetBackendRegistryRef>
+ : public basic_parser<TargetBackendRegistryRef> {
+public:
+ parser(Option &O) : basic_parser(O) {}
+ bool parse(Option &O, StringRef ArgName, StringRef Arg,
+ TargetBackendRegistryRef &Val);
+ StringRef getValueName() const override { return "target backend registry"; }
+ void printOptionDiff(const Option &O, TargetBackendRegistryRef V,
+ const OptVal &Default, size_t GlobalWidth) const;
+ void anchor() override;
+};
+
+} // namespace llvm::cl
+
#endif // IREE_COMPILER_DIALECT_HAL_TARGET_TARGETREGISTRY_H_
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/AssignTargetDevices.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/AssignTargetDevices.cpp
index 4ff28f6..e108e0b 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/AssignTargetDevices.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/AssignTargetDevices.cpp
@@ -23,36 +23,28 @@
namespace mlir::iree_compiler::IREE::HAL {
-class AssignTargetDevicesPass
- : public PassWrapper<AssignTargetDevicesPass, OperationPass<ModuleOp>> {
-public:
- AssignTargetDevicesPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- AssignTargetDevicesPass(const AssignTargetDevicesPass &pass)
- : targetRegistry(pass.targetRegistry) {}
- AssignTargetDevicesPass(const TargetBackendRegistry &targetRegistry,
- ArrayRef<std::string> targets)
- : targetRegistry(targetRegistry) {
- this->targets = targets;
- }
+#define GEN_PASS_DEF_ASSIGNTARGETDEVICESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+namespace {
+
+//===----------------------------------------------------------------------===//
+// --iree-hal-assign-target-devices
+//===----------------------------------------------------------------------===//
+
+struct AssignTargetDevicesPass
+ : public IREE::HAL::impl::AssignTargetDevicesPassBase<
+ AssignTargetDevicesPass> {
+ using IREE::HAL::impl::AssignTargetDevicesPassBase<
+ AssignTargetDevicesPass>::AssignTargetDevicesPassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
- for (auto &targetBackend : targetRegistry.getTargetBackends(
- targetRegistry.getRegisteredTargetBackends())) {
+ for (auto &targetBackend : targetRegistry->getTargetBackends(
+ targetRegistry->getRegisteredTargetBackends())) {
targetBackend->getDependentDialects(registry);
}
}
- StringRef getArgument() const override {
- return "iree-hal-assign-target-devices";
- }
-
- StringRef getDescription() const override {
- return "Assigns the HAL devices the module will target to the given list "
- "of targets.";
- }
-
void runOnOperation() override {
auto moduleOp = getOperation();
@@ -76,13 +68,13 @@
llvm::SmallDenseSet<Attribute> targetAttrSet;
SmallVector<Attribute> targetAttrs;
for (const auto &targetName : targets) {
- auto targetBackend = targetRegistry.getTargetBackend(targetName);
+ auto targetBackend = targetRegistry->getTargetBackend(targetName);
if (!targetBackend) {
std::string backends;
llvm::raw_string_ostream os(backends);
llvm::interleaveComma(
- targetRegistry.getTargetBackends(
- targetRegistry.getRegisteredTargetBackends()),
+ targetRegistry->getTargetBackends(
+ targetRegistry->getRegisteredTargetBackends()),
os,
[&os](const std::shared_ptr<
mlir::iree_compiler::IREE::HAL::TargetBackend>
@@ -106,23 +98,8 @@
moduleOp->setAttr("hal.device.targets",
ArrayAttr::get(moduleOp.getContext(), targetAttrs));
}
-
-private:
- ListOption<std::string> targets{*this, "targets",
- llvm::cl::desc("List of devices to target."),
- llvm::cl::ZeroOrMore};
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<ModuleOp>>
-createAssignTargetDevicesPass(const TargetBackendRegistry &targetRegistry,
- ArrayRef<std::string> targets) {
- return std::make_unique<AssignTargetDevicesPass>(targetRegistry, targets);
-}
-
-static PassRegistration<AssignTargetDevicesPass> pass([] {
- return std::make_unique<AssignTargetDevicesPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/BUILD.bazel b/compiler/src/iree/compiler/Dialect/HAL/Transforms/BUILD.bazel
index 174c42f..a1d4f13 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/BUILD.bazel
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/BUILD.bazel
@@ -4,7 +4,7 @@
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-load("//build_tools/bazel:build_defs.oss.bzl", "iree_compiler_cc_library")
+load("//build_tools/bazel:build_defs.oss.bzl", "iree_compiler_cc_library", "iree_gentbl_cc_library")
package(
default_visibility = ["//visibility:public"],
@@ -16,7 +16,6 @@
name = "Transforms",
srcs = [
"AssignTargetDevices.cpp",
- "BenchmarkBatchDispatches.cpp",
"ConfigureExecutables.cpp",
"ConvertToHAL.cpp",
"DumpExecutableBenchmarks.cpp",
@@ -29,7 +28,9 @@
"MaterializeResourceCaches.cpp",
"MemoizeDeviceQueries.cpp",
"Passes.cpp",
+ "Passes.h.inc",
"PreprocessExecutables.cpp",
+ "RepeatDispatches.cpp",
"ResolveExportOrdinals.cpp",
"SerializeExecutables.cpp",
"StripExecutableContents.cpp",
@@ -41,6 +42,7 @@
"Passes.h",
],
deps = [
+ ":PassesIncGen",
"//compiler/src/iree/compiler/Codegen/Common/CPU:CommonCPUPasses",
"//compiler/src/iree/compiler/Codegen/Dialect:IREECodegenDialect",
"//compiler/src/iree/compiler/Dialect/Flow/IR",
@@ -78,3 +80,18 @@
"@llvm-project//mlir:Transforms",
],
)
+
+iree_gentbl_cc_library(
+ name = "PassesIncGen",
+ tbl_outs = [
+ (
+ ["--gen-pass-decls"],
+ "Passes.h.inc",
+ ),
+ ],
+ tblgen = "@llvm-project//mlir:mlir-tblgen",
+ td_file = "Passes.td",
+ deps = [
+ "@llvm-project//mlir:PassBaseTdFiles",
+ ],
+)
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/BenchmarkBatchDispatches.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/BenchmarkBatchDispatches.cpp
deleted file mode 100644
index 098f5dc..0000000
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/BenchmarkBatchDispatches.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2021 The IREE Authors
-//
-// Licensed 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
-
-#include "iree/compiler/Dialect/HAL/IR/HALDialect.h"
-#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
-#include "iree/compiler/Dialect/HAL/IR/HALTypes.h"
-#include "mlir/Dialect/Func/IR/FuncOps.h"
-#include "mlir/Pass/Pass.h"
-
-namespace mlir::iree_compiler::IREE::HAL {
-namespace {
-
-// Repeats dispatches a specified number of times.
-class BenchmarkBatchDispatchesPass
- : public PassWrapper<BenchmarkBatchDispatchesPass,
- OperationPass<func::FuncOp>> {
-public:
- MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(BenchmarkBatchDispatchesPass)
-
- explicit BenchmarkBatchDispatchesPass(unsigned repeatCount)
- : repeatCount_(repeatCount) {}
-
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<func::FuncDialect, IREE::HAL::HALDialect>();
- }
-
- StringRef getArgument() const override {
- return "test-iree-hal-benchmark-batch-dispatches-2-times";
- }
-
- StringRef getDescription() const override {
- return "Test pass used for benchmarking batch dispatches analysis";
- }
-
- void runOnOperation() override {
- // Collect all (nested) command buffer dispatch ops.
- std::vector<IREE::HAL::CommandBufferDispatchOp> ops;
- getOperation().walk(
- [&ops](IREE::HAL::CommandBufferDispatchOp op) { ops.push_back(op); });
- for (auto op : ops) {
- OpBuilder builder(op);
- for (unsigned i = 1; i < repeatCount_; ++i) {
- builder.clone(*op.getOperation());
- // Add a barrier after each clone. If the original dispatch has a small
- // problem size, simply duplicating without barrier will increase the
- // number of subgroups and thus "help" filling the GPU. In the end we
- // will have an over optimistic result. Inserting barriers avoids that,
- // but it assumes that the command buffer has a linear dispatch
- // structure.
- builder.create<IREE::HAL::CommandBufferExecutionBarrierOp>(
- op.getLoc(), op.getCommandBuffer(),
- IREE::HAL::ExecutionStageBitfield::CommandRetire |
- IREE::HAL::ExecutionStageBitfield::Dispatch,
- IREE::HAL::ExecutionStageBitfield::CommandIssue |
- IREE::HAL::ExecutionStageBitfield::Dispatch,
- IREE::HAL::ExecutionBarrierFlagBitfield::None);
- }
- }
- }
-
-private:
- unsigned repeatCount_;
-};
-
-} // namespace
-
-std::unique_ptr<OperationPass<func::FuncOp>>
-createBenchmarkBatchDispatchesPass(unsigned repeatCount) {
- return std::make_unique<BenchmarkBatchDispatchesPass>(repeatCount);
-}
-
-static PassRegistration<BenchmarkBatchDispatchesPass> pass([] {
- return std::make_unique<BenchmarkBatchDispatchesPass>(2);
-});
-
-} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/CMakeLists.txt b/compiler/src/iree/compiler/Dialect/HAL/Transforms/CMakeLists.txt
index b24af6a..d88c4fb 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/CMakeLists.txt
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/CMakeLists.txt
@@ -17,7 +17,6 @@
"Passes.h"
SRCS
"AssignTargetDevices.cpp"
- "BenchmarkBatchDispatches.cpp"
"ConfigureExecutables.cpp"
"ConvertToHAL.cpp"
"DumpExecutableBenchmarks.cpp"
@@ -30,7 +29,9 @@
"MaterializeResourceCaches.cpp"
"MemoizeDeviceQueries.cpp"
"Passes.cpp"
+ "Passes.h.inc"
"PreprocessExecutables.cpp"
+ "RepeatDispatches.cpp"
"ResolveExportOrdinals.cpp"
"SerializeExecutables.cpp"
"StripExecutableContents.cpp"
@@ -38,6 +39,7 @@
"TranslateExecutables.cpp"
"VerifyTargetEnvironment.cpp"
DEPS
+ ::PassesIncGen
LLVMSupport
MLIRAffineToStandard
MLIRArithDialect
@@ -76,4 +78,13 @@
PUBLIC
)
+iree_tablegen_library(
+ NAME
+ PassesIncGen
+ TD_FILE
+ "Passes.td"
+ OUTS
+ --gen-pass-decls Passes.h.inc
+)
+
### BAZEL_TO_CMAKE_PRESERVES_ALL_CONTENT_BELOW_THIS_LINE ###
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp
index ae42202..9ee5f73 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConfigureExecutables.cpp
@@ -11,6 +11,7 @@
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Target/TargetBackend.h"
#include "iree/compiler/Dialect/HAL/Target/TargetRegistry.h"
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
#include "iree/compiler/Utils/TracingUtils.h"
#include "llvm/ADT/StringSet.h"
#include "mlir/IR/Attributes.h"
@@ -21,42 +22,37 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_CONFIGUREEXECUTABLESPASS
+#define GEN_PASS_DEF_CONFIGURETARGETEXECUTABLEVARIANTSPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
+//===----------------------------------------------------------------------===//
+// --iree-hal-configure-target-executable-variants
+//===----------------------------------------------------------------------===//
+
class ConfigureTargetExecutableVariantsPass
- : public PassWrapper<ConfigureTargetExecutableVariantsPass,
- OperationPass<IREE::HAL::ExecutableVariantOp>> {
-public:
- ConfigureTargetExecutableVariantsPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- ConfigureTargetExecutableVariantsPass(
- const ConfigureTargetExecutableVariantsPass &pass)
- : targetRegistry(pass.targetRegistry) {}
- ConfigureTargetExecutableVariantsPass(
- const TargetBackendRegistry &targetRegistry, StringRef target)
- : targetRegistry(targetRegistry) {
- this->target = target.str();
- }
-
- StringRef getArgument() const override {
- return "iree-hal-configure-target-executable-variants";
- }
-
- StringRef getDescription() const override {
- return "Configures a hal.executable.variant op for translation";
- }
+ : public IREE::HAL::impl::ConfigureTargetExecutableVariantsPassBase<
+ ConfigureTargetExecutableVariantsPass> {
+ using IREE::HAL::impl::ConfigureTargetExecutableVariantsPassBase<
+ ConfigureTargetExecutableVariantsPass>::
+ ConfigureTargetExecutableVariantsPassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (targetBackend) {
targetBackend->getDependentDialects(registry);
}
}
+
void runOnOperation() override {
auto variantOp = getOperation();
if (variantOp.getTarget().getBackend().getValue() != target)
return;
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (!targetBackend) {
variantOp.emitError() << "unregistered target backend '" << target << "'";
return signalPassFailure();
@@ -78,51 +74,22 @@
return signalPassFailure();
}
}
-
-private:
- Option<std::string> target{
- *this, "target",
- llvm::cl::desc(
- "Target backend name whose executables will be configured by "
- "this pass.")};
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableVariantOp>>
-createConfigureTargetExecutableVariantsPass(
- const TargetBackendRegistry &targetRegistry, StringRef target) {
- return std::make_unique<ConfigureTargetExecutableVariantsPass>(targetRegistry,
- target);
-}
+//===----------------------------------------------------------------------===//
+// --iree-hal-configure-executables
+//===----------------------------------------------------------------------===//
-static PassRegistration<ConfigureTargetExecutableVariantsPass> linkTargetPass(
- [] { return std::make_unique<ConfigureTargetExecutableVariantsPass>(); });
-
-class ConfigureExecutablesPass
- : public PassWrapper<ConfigureExecutablesPass,
- OperationPass<IREE::HAL::ExecutableOp>> {
-public:
- ConfigureExecutablesPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- ConfigureExecutablesPass(const ConfigureExecutablesPass &pass)
- : targetRegistry(pass.targetRegistry) {}
- ConfigureExecutablesPass(const TargetBackendRegistry &targetRegistry)
- : targetRegistry(targetRegistry) {}
-
- StringRef getArgument() const override {
- return "iree-hal-configure-executables";
- }
-
- StringRef getDescription() const override {
- return "Configures hal.executable.variant ops for translation to "
- "hal.executable.binary ops";
- }
+struct ConfigureExecutablesPass
+ : public IREE::HAL::impl::ConfigureExecutablesPassBase<
+ ConfigureExecutablesPass> {
+ using IREE::HAL::impl::ConfigureExecutablesPassBase<
+ ConfigureExecutablesPass>::ConfigureExecutablesPassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
- auto targetBackends = targetRegistry.getTargetBackends(
- targetRegistry.getRegisteredTargetBackends());
+ auto targetBackends = targetRegistry->getTargetBackends(
+ targetRegistry->getRegisteredTargetBackends());
for (auto &targetBackend : targetBackends) {
targetBackend->getDependentDialects(registry);
}
@@ -133,8 +100,8 @@
OpPassManager passManager(executableOp.getOperationName());
for (const auto &targetName : gatherExecutableTargetNames(executableOp)) {
passManager.addNestedPass<IREE::HAL::ExecutableVariantOp>(
- createConfigureTargetExecutableVariantsPass(targetRegistry,
- targetName));
+ IREE::HAL::createConfigureTargetExecutableVariantsPass(
+ {targetRegistry, targetName}));
}
IREE_COMPILER_TRACE_MESSAGE_DYNAMIC(INFO, executableOp.getSymName().str());
@@ -144,18 +111,8 @@
return signalPassFailure();
}
}
-
-private:
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createConfigureExecutablesPass(const TargetBackendRegistry &targetRegistry) {
- return std::make_unique<ConfigureExecutablesPass>(targetRegistry);
-}
-
-static PassRegistration<ConfigureExecutablesPass> translatePass([] {
- return std::make_unique<ConfigureExecutablesPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConvertToHAL.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConvertToHAL.cpp
index b140cde..6269438 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConvertToHAL.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ConvertToHAL.cpp
@@ -34,32 +34,18 @@
#include "mlir/Transforms/DialectConversion.h"
namespace mlir::iree_compiler::IREE::HAL {
+
+#define GEN_PASS_DEF_CONVERTTOHALPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
namespace {
-// A pass converting the IREE flow dialect into the IREE HAL dialect.
-class ConvertToHALPass
- : public PassWrapper<ConvertToHALPass, OperationPass<ModuleOp>> {
-public:
- MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(ConvertToHALPass)
+//===----------------------------------------------------------------------===//
+// --iree-hal-conversion
+//===----------------------------------------------------------------------===//
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<mlir::arith::ArithDialect>();
- registry.insert<mlir::func::FuncDialect>();
- registry.insert<mlir::scf::SCFDialect>();
- registry.insert<IREE::HAL::HALDialect>();
- registry.insert<IREE::Stream::StreamDialect>();
- registry.insert<IREE::Util::UtilDialect>();
-
- // TODO(benvanik): add a registration system for extra dialects?
- registry.insert<IREE::IO::Parameters::IOParametersDialect>();
- }
-
- StringRef getArgument() const override { return "iree-hal-conversion"; }
-
- StringRef getDescription() const override {
- return "Convert input stream/std/etc dialects to the IREE HAL dialect.";
- }
-
+struct ConvertToHALPass
+ : public IREE::HAL::impl::ConvertToHALPassBase<ConvertToHALPass> {
void runOnOperation() override {
auto *context = &getContext();
@@ -106,10 +92,4 @@
} // namespace
-std::unique_ptr<OperationPass<ModuleOp>> createConvertToHALPass() {
- return std::make_unique<ConvertToHALPass>();
-}
-
-static PassRegistration<ConvertToHALPass> pass;
-
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp
index 5fc02a5..473c392 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp
@@ -11,6 +11,7 @@
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
#include "iree/compiler/Dialect/Stream/IR/StreamOps.h"
+#include "iree/compiler/Dialect/Util/IR/UtilDialect.h"
#include "iree/compiler/Utils/IndexSet.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
@@ -28,6 +29,11 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_DUMPEXECUTABLEBENCHMARKSPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
// We could use the resource constraints in the module when we have them.
static const int64_t kBufferAlignment = 256;
@@ -446,28 +452,15 @@
os << "\n"; // newline at end of file
}
-class DumpExecutableBenchmarksPass
- : public PassWrapper<DumpExecutableBenchmarksPass,
- OperationPass<ModuleOp>> {
-public:
- DumpExecutableBenchmarksPass() = default;
- DumpExecutableBenchmarksPass(const DumpExecutableBenchmarksPass &pass) {}
- DumpExecutableBenchmarksPass(StringRef path) { this->path = path.str(); }
+//===----------------------------------------------------------------------===//
+// --iree-hal-dump-executable-benchmarks
+//===----------------------------------------------------------------------===//
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<IREE::HAL::HALDialect>();
- registry.insert<arith::ArithDialect>();
- registry.insert<scf::SCFDialect>();
- }
-
- StringRef getArgument() const override {
- return "iree-hal-dump-executable-benchmarks";
- }
-
- StringRef getDescription() const override {
- return "Dumps standalone hal.executable benchmarks to a path.";
- }
-
+struct DumpExecutableBenchmarksPass
+ : public IREE::HAL::impl::DumpExecutableBenchmarksPassBase<
+ DumpExecutableBenchmarksPass> {
+ using IREE::HAL::impl::DumpExecutableBenchmarksPassBase<
+ DumpExecutableBenchmarksPass>::DumpExecutableBenchmarksPassBase;
void runOnOperation() override {
auto moduleOp = getOperation();
auto moduleName = moduleOp.getName().value_or("module");
@@ -519,20 +512,8 @@
}
}
}
-
-private:
- Option<std::string> path{
- *this, "path",
- llvm::cl::desc("Path to write hal.executable benchmarks into.")};
};
-std::unique_ptr<OperationPass<ModuleOp>>
-createDumpExecutableBenchmarksPass(StringRef path) {
- return std::make_unique<DumpExecutableBenchmarksPass>(path);
-}
-
-static PassRegistration<DumpExecutableBenchmarksPass> pass([] {
- return std::make_unique<DumpExecutableBenchmarksPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableSources.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableSources.cpp
index 6ba9c54..defca30 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableSources.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableSources.cpp
@@ -19,6 +19,11 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_DUMPEXECUTABLESOURCESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
static void dumpExecutableToStream(IREE::HAL::ExecutableOp executableOp,
StringRef filePath, llvm::raw_ostream &os) {
OpPrintingFlags flags;
@@ -27,28 +32,15 @@
os << "\n"; // newline at end of file
}
-class DumpExecutableSourcesPass
- : public PassWrapper<DumpExecutableSourcesPass, OperationPass<ModuleOp>> {
-public:
- DumpExecutableSourcesPass() = default;
- DumpExecutableSourcesPass(const DumpExecutableSourcesPass &pass) {}
- DumpExecutableSourcesPass(StringRef path, StringRef prefix) {
- this->path = path.str();
- this->prefix = prefix.str();
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-dump-executable-sources
+//===----------------------------------------------------------------------===//
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<IREE::HAL::HALDialect>();
- }
-
- StringRef getArgument() const override {
- return "iree-hal-dump-executable-sources";
- }
-
- StringRef getDescription() const override {
- return "Dumps individual hal.executable source listings to a path.";
- }
-
+struct DumpExecutableSourcesPass
+ : public IREE::HAL::impl::DumpExecutableSourcesPassBase<
+ DumpExecutableSourcesPass> {
+ using IREE::HAL::impl::DumpExecutableSourcesPassBase<
+ DumpExecutableSourcesPass>::DumpExecutableSourcesPassBase;
void runOnOperation() override {
auto moduleOp = getOperation();
auto moduleName = moduleOp.getName().value_or("module");
@@ -88,24 +80,8 @@
executableOp.setVisibility(originalVisibility);
}
}
-
-private:
- Option<std::string> path{
- *this, "path",
- llvm::cl::desc("Path to write hal.executable source files into.")};
-
- Option<std::string> prefix{
- *this, "prefix",
- llvm::cl::desc("String to prefix the written files with.")};
};
-std::unique_ptr<OperationPass<ModuleOp>>
-createDumpExecutableSourcesPass(StringRef path, StringRef prefix) {
- return std::make_unique<DumpExecutableSourcesPass>(path, prefix);
-}
-
-static PassRegistration<DumpExecutableSourcesPass> pass([] {
- return std::make_unique<DumpExecutableSourcesPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ElideRedundantCommands.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ElideRedundantCommands.cpp
index 2e9cc48..77eb5bc 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ElideRedundantCommands.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ElideRedundantCommands.cpp
@@ -19,6 +19,10 @@
#include "mlir/Pass/Pass.h"
namespace mlir::iree_compiler::IREE::HAL {
+
+#define GEN_PASS_DEF_ELIDEREDUNDANTCOMMANDSPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
namespace {
struct DescriptorState {
@@ -82,8 +86,6 @@
using CommandBufferStateMap = DenseMap<Value, CommandBufferState>;
-} // namespace
-
static void processOp(IREE::HAL::CommandBufferExecutionBarrierOp op,
CommandBufferState &state) {
if (state.previousFullBarrier) {
@@ -201,21 +203,13 @@
return success();
}
-class ElideRedundantCommandsPass
- : public PassWrapper<ElideRedundantCommandsPass, OperationPass<void>> {
-public:
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<IREE::HAL::HALDialect>();
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-elide-redundant-commands
+//===----------------------------------------------------------------------===//
- StringRef getArgument() const override {
- return "iree-hal-elide-redundant-commands";
- }
-
- StringRef getDescription() const override {
- return "Elides stateful command buffer ops that set redundant state.";
- }
-
+struct ElideRedundantCommandsPass
+ : public IREE::HAL::impl::ElideRedundantCommandsPassBase<
+ ElideRedundantCommandsPass> {
void runOnOperation() override {
auto parentOp = getOperation();
@@ -287,10 +281,6 @@
}
};
-std::unique_ptr<OperationPass<void>> createElideRedundantCommandsPass() {
- return std::make_unique<ElideRedundantCommandsPass>();
-}
-
-static PassRegistration<ElideRedundantCommandsPass> pass;
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/FixupLegacySync.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/FixupLegacySync.cpp
index 47cfe10..0a082b7 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/FixupLegacySync.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/FixupLegacySync.cpp
@@ -4,8 +4,10 @@
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#include "iree/compiler/Dialect/HAL/IR/HALDialect.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
+#include "iree/compiler/Dialect/Util/IR/UtilDialect.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/IR/Attributes.h"
@@ -16,6 +18,11 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_FIXUPLEGACYSYNCPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
// Marks a command buffer as being executable inline during recording.
// This is only possible because we generate our command buffer code without
// caching today and know that all are executable inline so long as we have
@@ -134,19 +141,12 @@
}
}
-// NOTE: this pass only exists for backwards compatibility with legacy HAL
-// drivers. It will be removed once all have migrated to the modern async APIs.
+//===----------------------------------------------------------------------===//
+// --iree-hal-fixup-legacy-sync
+//===----------------------------------------------------------------------===//
+
struct FixupLegacySyncPass
- : public PassWrapper<FixupLegacySyncPass, OperationPass<mlir::ModuleOp>> {
- StringRef getArgument() const override {
- return "iree-hal-fixup-legacy-sync";
- }
-
- StringRef getDescription() const override {
- return "Applies fixups to the program for when using legacy HAL devices "
- "that only support synchronous execution";
- }
-
+ : public IREE::HAL::impl::FixupLegacySyncPassBase<FixupLegacySyncPass> {
void runOnOperation() override {
auto moduleOp = getOperation();
@@ -182,10 +182,6 @@
}
};
-std::unique_ptr<OperationPass<mlir::ModuleOp>> createFixupLegacySyncPass() {
- return std::make_unique<FixupLegacySyncPass>();
-}
-
-static PassRegistration<FixupLegacySyncPass> pass;
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/LinkExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/LinkExecutables.cpp
index 8e828b6..8951945 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/LinkExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/LinkExecutables.cpp
@@ -11,6 +11,7 @@
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Target/TargetBackend.h"
#include "iree/compiler/Dialect/HAL/Target/TargetRegistry.h"
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
#include "llvm/ADT/StringSet.h"
#include "mlir/IR/Attributes.h"
#include "mlir/IR/Builders.h"
@@ -21,31 +22,25 @@
namespace mlir::iree_compiler::IREE::HAL {
-class LinkTargetExecutablesPass
- : public PassWrapper<LinkTargetExecutablesPass,
- OperationPass<mlir::ModuleOp>> {
-public:
- LinkTargetExecutablesPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- LinkTargetExecutablesPass(const LinkTargetExecutablesPass &pass)
- : targetRegistry(pass.targetRegistry) {}
- LinkTargetExecutablesPass(const TargetBackendRegistry &targetRegistry,
- StringRef target)
- : targetRegistry(targetRegistry) {
- this->target = target.str();
- }
+#define GEN_PASS_DEF_LINKEXECUTABLESPASS
+#define GEN_PASS_DEF_LINKTARGETEXECUTABLESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
- StringRef getArgument() const override {
- return "iree-hal-link-target-executables";
- }
+namespace {
- StringRef getDescription() const override {
- return "Links together hal.executables for the specified target.";
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-link-target-executables
+//===----------------------------------------------------------------------===//
+
+struct LinkTargetExecutablesPass
+ : public IREE::HAL::impl::LinkTargetExecutablesPassBase<
+ LinkTargetExecutablesPass> {
+ using IREE::HAL::impl::LinkTargetExecutablesPassBase<
+ LinkTargetExecutablesPass>::LinkTargetExecutablesPassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (targetBackend) {
targetBackend->getDependentDialects(registry);
}
@@ -53,7 +48,7 @@
void runOnOperation() override {
auto moduleOp = getOperation();
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (!targetBackend) {
moduleOp.emitError() << "unregistered target backend '" << target << "'";
return signalPassFailure();
@@ -68,38 +63,16 @@
return signalPassFailure();
}
}
-
-private:
- Option<std::string> target{
- *this, "target",
- llvm::cl::desc("Target backend name whose executables will be linked by "
- "this pass.")};
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createLinkTargetExecutablesPass(const TargetBackendRegistry &targetRegistry,
- StringRef target) {
- return std::make_unique<LinkTargetExecutablesPass>(targetRegistry, target);
-}
+//===----------------------------------------------------------------------===//
+// --iree-hal-link-executables
+//===----------------------------------------------------------------------===//
-static PassRegistration<LinkTargetExecutablesPass> linkTargetPass([] {
- return std::make_unique<LinkTargetExecutablesPass>();
-});
-
-class LinkExecutablesPass
- : public PassWrapper<LinkExecutablesPass, OperationPass<mlir::ModuleOp>> {
-public:
- LinkExecutablesPass(const TargetBackendRegistry &targetRegistry)
- : targetRegistry(targetRegistry) {}
-
- StringRef getArgument() const override { return "iree-hal-link-executables"; }
-
- StringRef getDescription() const override {
- return "Links together hal.executables depending on target backend rules";
- }
-
+struct LinkExecutablesPass
+ : public IREE::HAL::impl::LinkExecutablesPassBase<LinkExecutablesPass> {
+ using IREE::HAL::impl::LinkExecutablesPassBase<
+ LinkExecutablesPass>::LinkExecutablesPassBase;
void runOnOperation() override {
auto moduleOp = getOperation();
@@ -107,8 +80,8 @@
// These will create/rearrange executables.
OpPassManager passManager(moduleOp.getOperationName());
for (const auto &targetName : gatherExecutableTargetNames(moduleOp)) {
- passManager.addPass(
- createLinkTargetExecutablesPass(targetRegistry, targetName));
+ passManager.addPass(IREE::HAL::createLinkTargetExecutablesPass(
+ {targetRegistry, targetName}));
}
// Cleanup any remaining empty executables after each pipeline has run.
@@ -121,18 +94,8 @@
return signalPassFailure();
}
}
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createLinkExecutablesPass(const TargetBackendRegistry &targetRegistry) {
- return std::make_unique<LinkExecutablesPass>(targetRegistry);
-}
-
-static PassRegistration<LinkExecutablesPass> linkPass([] {
- return std::make_unique<LinkExecutablesPass>(
- TargetBackendRegistry::getGlobal());
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeDispatchInstrumentation.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeDispatchInstrumentation.cpp
index 8c1244c..b48f7c9 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeDispatchInstrumentation.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeDispatchInstrumentation.cpp
@@ -27,6 +27,11 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_MATERIALIZEDISPATCHINSTRUMENTATIONPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
static std::string getAttrStr(Attribute attr) {
if (!attr)
return "";
@@ -94,32 +99,16 @@
}
}
-class MaterializeDispatchInstrumentationPass
- : public PassWrapper<MaterializeDispatchInstrumentationPass,
- OperationPass<mlir::ModuleOp>> {
-public:
- MaterializeDispatchInstrumentationPass() = default;
- MaterializeDispatchInstrumentationPass(
- const MaterializeDispatchInstrumentationPass &pass) {}
- explicit MaterializeDispatchInstrumentationPass(int64_t bufferSize) {
- this->bufferSize = bufferSize;
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-materialize-dispatch-instrumentation
+//===----------------------------------------------------------------------===//
- StringRef getArgument() const override {
- return "iree-hal-materialize-dispatch-instrumentation";
- }
-
- StringRef getDescription() const override {
- return "Materializes dispatch instrumentation resources.";
- }
-
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<mlir::arith::ArithDialect>();
- registry.insert<IREE::HAL::HALDialect>();
- registry.insert<IREE::Stream::StreamDialect>();
- registry.insert<IREE::Util::UtilDialect>();
- }
-
+struct MaterializeDispatchInstrumentationPass
+ : public IREE::HAL::impl::MaterializeDispatchInstrumentationPassBase<
+ MaterializeDispatchInstrumentationPass> {
+ using IREE::HAL::impl::MaterializeDispatchInstrumentationPassBase<
+ MaterializeDispatchInstrumentationPass>::
+ MaterializeDispatchInstrumentationPassBase;
void runOnOperation() override {
auto moduleOp = getOperation();
if (moduleOp.getBody()->empty())
@@ -378,23 +367,8 @@
queryBuilder.create<func::ReturnOp>(loc);
}
}
-
-private:
- Option<llvm::cl::PowerOf2ByteSize> bufferSize{
- *this,
- "bufferSize",
- llvm::cl::desc("Power-of-two byte size of the instrumentation buffer."),
- llvm::cl::init(llvm::cl::PowerOf2ByteSize(64 * 1024 * 1024)),
- };
};
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createMaterializeDispatchInstrumentationPass(int64_t bufferSize) {
- return std::make_unique<MaterializeDispatchInstrumentationPass>(bufferSize);
-}
-
-static PassRegistration<MaterializeDispatchInstrumentationPass> pass([] {
- return std::make_unique<MaterializeDispatchInstrumentationPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeInterfaces.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeInterfaces.cpp
index 0b0ba53..2953df0 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeInterfaces.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeInterfaces.cpp
@@ -29,6 +29,10 @@
#define DEBUG_TYPE "iree-hal-materialize-interfaces"
namespace mlir::iree_compiler::IREE::HAL {
+
+#define GEN_PASS_DEF_MATERIALIZEINTERFACESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
namespace {
// Map of original SymbolRefAttr to a list of SymbolRefAttrs in variants.
@@ -510,28 +514,12 @@
}
//===----------------------------------------------------------------------===//
-// -iree-hal-materialize-interfaces
+// --iree-hal-materialize-interfaces
//===----------------------------------------------------------------------===//
-class MaterializeInterfacesPass
- : public PassWrapper<MaterializeInterfacesPass, OperationPass<ModuleOp>> {
-public:
- MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(MaterializeInterfacesPass)
-
- MaterializeInterfacesPass() = default;
-
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<IREE::HAL::HALDialect>();
- }
-
- StringRef getArgument() const override {
- return "iree-hal-materialize-interfaces";
- }
-
- StringRef getDescription() const override {
- return "Materializes hal.executable ops from stream.executable ops";
- }
-
+struct MaterializeInterfacesPass
+ : public IREE::HAL::impl::MaterializeInterfacesPassBase<
+ MaterializeInterfacesPass> {
void runOnOperation() override {
SymbolTable symbolTable(getOperation());
@@ -656,12 +644,4 @@
} // namespace
-std::unique_ptr<OperationPass<ModuleOp>> createMaterializeInterfacesPass() {
- return std::make_unique<MaterializeInterfacesPass>();
-}
-
-static PassRegistration<MaterializeInterfacesPass> pass([] {
- return std::make_unique<MaterializeInterfacesPass>();
-});
-
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeResourceCaches.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeResourceCaches.cpp
index 3b0bb79..3620e52 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeResourceCaches.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MaterializeResourceCaches.cpp
@@ -10,6 +10,7 @@
#include "iree/compiler/Dialect/HAL/IR/HALDialect.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
+#include "iree/compiler/Dialect/Util/IR/UtilDialect.h"
#include "iree/compiler/Dialect/Util/IR/UtilOps.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Dialect/Func/IR/FuncOps.h"
@@ -22,27 +23,15 @@
namespace mlir::iree_compiler::IREE::HAL {
-class MaterializeResourceCachesPass
- : public PassWrapper<MaterializeResourceCachesPass,
- OperationPass<ModuleOp>> {
-public:
- explicit MaterializeResourceCachesPass(TargetOptions targetOptions)
- : targetOptions_(targetOptions) {}
+#define GEN_PASS_DEF_MATERIALIZERESOURCECACHESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
- StringRef getArgument() const override {
- return "iree-hal-materialize-resource-caches";
- }
+namespace {
- StringRef getDescription() const override {
- return "Materializes hal.executable resource caches and rewrites lookups.";
- }
-
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<mlir::arith::ArithDialect>();
- registry.insert<mlir::scf::SCFDialect>();
- registry.insert<IREE::HAL::HALDialect>();
- }
-
+// TODO(multi-device): rewrite this to shard resources per device.
+struct MaterializeResourceCachesPass
+ : public IREE::HAL::impl::MaterializeResourceCachesPassBase<
+ MaterializeResourceCachesPass> {
void runOnOperation() override {
auto moduleOp = getOperation();
if (moduleOp.getBody()->empty())
@@ -368,8 +357,6 @@
lookupOp.erase();
}
- TargetOptions targetOptions_;
-
OpBuilder moduleBuilder{static_cast<MLIRContext *>(nullptr)};
DenseMap<std::pair<Attribute, IREE::HAL::DescriptorSetLayoutFlags>,
IREE::Util::GlobalOp>
@@ -382,14 +369,6 @@
int nextUniqueDescriptorSetLayoutId = 0;
};
-std::unique_ptr<OperationPass<ModuleOp>>
-createMaterializeResourceCachesPass(TargetOptions targetOptions) {
- return std::make_unique<MaterializeResourceCachesPass>(targetOptions);
-}
-
-static PassRegistration<MaterializeResourceCachesPass> pass([] {
- auto options = TargetOptions::FromFlags::get();
- return std::make_unique<MaterializeResourceCachesPass>(options);
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MemoizeDeviceQueries.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MemoizeDeviceQueries.cpp
index 80845d3..1bc5ae0 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/MemoizeDeviceQueries.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/MemoizeDeviceQueries.cpp
@@ -6,32 +6,32 @@
#include <utility>
+#include "iree/compiler/Dialect/HAL/IR/HALDialect.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
-#include "llvm/ADT/StringSet.h"
-#include "mlir/Dialect/Func/IR/FuncOps.h"
+#include "iree/compiler/Dialect/Util/IR/UtilDialect.h"
#include "mlir/IR/Attributes.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/Diagnostics.h"
#include "mlir/Pass/Pass.h"
-#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_MEMOIZEDEVICEQUERIESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
+//===----------------------------------------------------------------------===//
+// --iree-hal-memoize-device-queries
+//===----------------------------------------------------------------------===//
+
// NOTE: this implementation is just for a single active device. As we start to
// support multiple devices we'll need to change this to be per-device.
-class MemoizeDeviceQueriesPass
- : public PassWrapper<MemoizeDeviceQueriesPass, OperationPass<ModuleOp>> {
-public:
- StringRef getArgument() const override {
- return "iree-hal-memoize-device-queries";
- }
-
- StringRef getDescription() const override {
- return "Caches hal.device.query results for use across the entire module";
- }
-
+struct MemoizeDeviceQueriesPass
+ : public IREE::HAL::impl::MemoizeDeviceQueriesPassBase<
+ MemoizeDeviceQueriesPass> {
void runOnOperation() override {
auto moduleOp = getOperation();
@@ -119,10 +119,6 @@
}
};
-std::unique_ptr<OperationPass<ModuleOp>> createMemoizeDeviceQueriesPass() {
- return std::make_unique<MemoizeDeviceQueriesPass>();
-}
-
-static PassRegistration<MemoizeDeviceQueriesPass> pass;
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.cpp
index ebdb4f3..1073e71 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.cpp
@@ -138,6 +138,10 @@
using FunctionLikeNest = MultiOpNest<func::FuncOp, IREE::Util::InitializerOp>;
+//===----------------------------------------------------------------------===//
+// Utilities
+//===----------------------------------------------------------------------===//
+
static void addCleanupPatterns(OpPassManager &passManager) {
// Standard MLIR cleanup.
passManager.addPass(mlir::createCSEPass());
@@ -155,6 +159,27 @@
passManager.addPass(IREE::Util::createFuseGlobalsPass());
}
+static void addExecutableSubstitutionPasses(OpPassManager &passManager,
+ ArrayRef<std::string> substitutions,
+ StringRef fromPath) {
+ if (!fromPath.empty()) {
+ SubstituteExecutablesPassOptions substituteOptions;
+ substituteOptions.searchPath = fromPath;
+ passManager.addPass(
+ IREE::HAL::createSubstituteExecutablesPass(substituteOptions));
+ }
+ if (!substitutions.empty()) {
+ SubstituteExecutablesPassOptions substituteOptions;
+ substituteOptions.substitutions = substitutions;
+ passManager.addPass(
+ IREE::HAL::createSubstituteExecutablesPass(substituteOptions));
+ }
+}
+
+//===----------------------------------------------------------------------===//
+// --iree-hal-configuration-pipeline
+//===----------------------------------------------------------------------===//
+
void buildHALConfigurationPassPipeline(
OpPassManager &passManager, const TargetBackendRegistry &targetRegistry,
const TargetOptions &targetOptions) {
@@ -178,29 +203,30 @@
// Today we just assign devices from parameters but we should instead be
// performing analysis at the flow level and then doing magic device
// database lookups here.
- passManager.addPass(
- createAssignTargetDevicesPass(targetRegistry, targetOptions.targets));
+ passManager.addPass(IREE::HAL::createAssignTargetDevicesPass(
+ {&targetRegistry, targetOptions.targets}));
}
- passManager.addPass(createVerifyTargetEnvironmentPass(targetRegistry));
+ passManager.addPass(
+ IREE::HAL::createVerifyTargetEnvironmentPass({targetRegistry}));
// Add dispatch instrumentation prior to materializing interfaces so we can
// more easily mutate the stream dispatch ops and exports.
if (auto bufferSize = clInstrumentDispatchBufferSize.getValue()) {
- passManager.addPass(
- createMaterializeDispatchInstrumentationPass(bufferSize.value));
+ passManager.addPass(IREE::HAL::createMaterializeDispatchInstrumentationPass(
+ {bufferSize.value}));
}
// Each executable needs a hal.interface to specify how the host and
// device communicate across the ABI boundary.
- passManager.addPass(createMaterializeInterfacesPass());
+ passManager.addPass(IREE::HAL::createMaterializeInterfacesPass());
// Dump a source listing of each hal.executable and update the source
// locations in the IR. This will allow us to easily inspect each executable
// and give downstream tools that can display source information something
// more useful and slim than the entire original source model.
if (!targetOptions.executableSourcesPath.empty()) {
- passManager.addPass(
- createDumpExecutableSourcesPass(targetOptions.executableSourcesPath));
+ passManager.addPass(IREE::HAL::createDumpExecutableSourcesPass(
+ {targetOptions.executableSourcesPath}));
}
// Substitute hal.executables we've generated from earlier phases of
@@ -209,15 +235,12 @@
// in various forms without modifying the end-to-end compiler. Note that we do
// this prior to dumping benchmarks in order to allow generating new
// benchmarks using the substituted executables.
- if (!clSubstituteExecutableSourcesFrom.empty()) {
- passManager.addPass(createSubstituteExecutablesPass(
- clSubstituteExecutableSourcesFrom.getValue()));
- }
- if (!clSubstituteExecutableSource.empty()) {
- passManager.addPass(
- createSubstituteExecutablesPass(clSubstituteExecutableSource));
- }
+ addExecutableSubstitutionPasses(passManager, clSubstituteExecutableSource,
+ clSubstituteExecutableSourcesFrom);
}
+//===----------------------------------------------------------------------===//
+// --iree-hal-transformation-pipeline
+//===----------------------------------------------------------------------===//
void buildHALTransformPassPipeline(OpPassManager &passManager,
const TargetBackendRegistry &targetRegistry,
@@ -241,7 +264,7 @@
// more variants and even insert or remove variants.
for (auto command : clPreprocessExecutablesWith) {
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- createPreprocessExecutablesPass(command));
+ IREE::HAL::createPreprocessExecutablesPass(command));
}
}
@@ -259,30 +282,21 @@
// selected translation strategies and the features each translation
// strategy are known to require or not require.
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- createConfigureExecutablesPass(targetRegistry));
+ IREE::HAL::createConfigureExecutablesPass({targetRegistry}));
// Dump a second listing of each hal.executable after preprocessing and
// configuration of executables, as well as update locations in the IR.
if (!targetOptions.executableConfigurationsPath.empty()) {
- passManager.addPass(createDumpExecutableSourcesPass(
- targetOptions.executableConfigurationsPath, "configured"));
+ passManager.addPass(IREE::HAL::createDumpExecutableSourcesPass(
+ {targetOptions.executableConfigurationsPath, "configured"}));
}
- if (!clSubstituteExecutableConfiguration.empty()) {
- passManager.addPass(
- createSubstituteExecutablesPass(clSubstituteExecutableConfiguration));
- }
// Substitute hal.executables we've configured with those specified on the
// command line. This developer feature allows for hand editing the
// configured executable with different lowering parameters.
- if (!clSubstituteExecutableConfigurationsFrom.empty()) {
- passManager.addPass(createSubstituteExecutablesPass(
- clSubstituteExecutableConfigurationsFrom.getValue()));
- }
- if (!clSubstituteExecutableConfiguration.empty()) {
- passManager.addPass(
- createSubstituteExecutablesPass(clSubstituteExecutableConfiguration));
- }
+ addExecutableSubstitutionPasses(passManager,
+ clSubstituteExecutableConfiguration,
+ clSubstituteExecutableConfigurationsFrom);
// Dump standalone hal.executable benchmark modules.
// Today this only works for executables that have static dispatch
@@ -290,8 +304,8 @@
// after configuration to make it easy to tweak configurations directly
// from the benchmark.
if (!targetOptions.executableBenchmarksPath.empty()) {
- passManager.addPass(createDumpExecutableBenchmarksPass(
- targetOptions.executableBenchmarksPath));
+ passManager.addPass(IREE::HAL::createDumpExecutableBenchmarksPass(
+ {targetOptions.executableBenchmarksPath}));
}
}
@@ -311,7 +325,7 @@
if (compileFrom < PipelinePhase::ExecutableTargets) {
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- createTranslateExecutablesPass(targetRegistry));
+ IREE::HAL::createTranslateExecutablesPass({targetRegistry}));
}
if (compileTo == PipelinePhase::ExecutableTargets)
@@ -324,25 +338,19 @@
// but sometimes translation is required to produce the host code required
// for specialization and workgroup counts and we need to perform the
// substitution later.
- if (!clSubstituteExecutableObjectsFrom.empty()) {
- passManager.addPass(createSubstituteExecutablesPass(
- clSubstituteExecutableObjectsFrom.getValue()));
- }
- if (!clSubstituteExecutableObject.empty()) {
- passManager.addPass(
- createSubstituteExecutablesPass(clSubstituteExecutableObject));
- }
+ addExecutableSubstitutionPasses(passManager, clSubstituteExecutableObject,
+ clSubstituteExecutableObjectsFrom);
//----------------------------------------------------------------------------
// Host program conversion
//----------------------------------------------------------------------------
// Convert supported input dialects (std, stream, etc) into the HAL dialect.
- passManager.addPass(createConvertToHALPass());
+ passManager.addPass(IREE::HAL::createConvertToHALPass());
// If any devices require the legacy synchronous execution behavior then
// make all async operations blocking.
- passManager.addPass(createFixupLegacySyncPass());
+ passManager.addPass(IREE::HAL::createFixupLegacySyncPass());
addCleanupPatterns(passManager);
@@ -358,17 +366,17 @@
// same architecture into a single executable and link it as a shared
// library.
if (transformOptions.linkExecutables) {
- passManager.addPass(createLinkExecutablesPass(targetRegistry));
+ passManager.addPass(IREE::HAL::createLinkExecutablesPass({targetRegistry}));
}
// Resolve export ordinals from nested symbol references prior to
// serialization. As this pass creates lookup ops it should run before
// MaterializeResourceCachesPass.
- passManager.addPass(createResolveExportOrdinalsPass());
+ passManager.addPass(IREE::HAL::createResolveExportOrdinalsPass());
// Gather cacheable resources such as executables and descriptor sets and
// cache them at initialization-time.
- passManager.addPass(createMaterializeResourceCachesPass(targetOptions));
+ passManager.addPass(IREE::HAL::createMaterializeResourceCachesPass());
//----------------------------------------------------------------------------
// Device management and specialization
@@ -376,19 +384,24 @@
// Memoize device queries such that we don't need to repeatedly ask the same
// information at runtime.
- passManager.addPass(createMemoizeDeviceQueriesPass());
+ passManager.addPass(IREE::HAL::createMemoizeDeviceQueriesPass());
// Big cleanup after all our conversion and materialization.
addCleanupPatterns(passManager);
- // HACK: repeat dispatch ops for benchmarks.
+ // Benchmarking only: repeat dispatch ops a certain number of times.
+ // This is guaranteed to invalidate program output and may introduce crashes
+ // if there are in-place dispatches that expect specific input data.
if (clBenchmarkDispatchRepeatCount != 1) {
- passManager.addNestedPass<mlir::func::FuncOp>(
- createBenchmarkBatchDispatchesPass(clBenchmarkDispatchRepeatCount));
+ FunctionLikeNest(passManager).addPass([&]() {
+ return IREE::HAL::createRepeatDispatchesPass(
+ {clBenchmarkDispatchRepeatCount});
+ });
}
// Elide redundant command buffer state ops created during conversion.
- FunctionLikeNest(passManager).addPass(createElideRedundantCommandsPass);
+ FunctionLikeNest(passManager)
+ .addPass(IREE::HAL::createElideRedundantCommandsPass);
// Fixup workgroup count calculations that may have used the affine dialect.
// Kind of random here but can happen if the benchmarking code does things.
@@ -410,10 +423,10 @@
// contents not turned into a big base64 string.
if (transformOptions.serializeExecutables) {
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- createSerializeExecutablesPass(
- targetRegistry, targetOptions.debugLevel,
- targetOptions.executableIntermediatesPath,
- targetOptions.executableBinariesPath));
+ IREE::HAL::createSerializeExecutablesPass(
+ {&targetRegistry, targetOptions.debugLevel,
+ targetOptions.executableIntermediatesPath,
+ targetOptions.executableBinariesPath}));
// NOTE: symbol DCE will destroy executable target contents, so only run
// it if we serialized things.
@@ -457,21 +470,35 @@
transformOptions, compileFrom, compileTo);
}
-void registerHALConfigurationPassPipeline() {
+//===----------------------------------------------------------------------===//
+// Registration
+//===----------------------------------------------------------------------===//
+
+namespace {
+#define GEN_PASS_REGISTRATION
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc" // IWYU pragma: export
+} // namespace
+
+void registerHALPasses() {
+ // Force the flags to be bound.
+ // TODO(benvanik): remove the global flags and only rely on pipeline flags.
+ (void)IREE::HAL::TargetOptions::FromFlags::get();
+
+ // Generated.
+ registerPasses();
+
+ // Pipelines.
PassPipelineRegistration<>("iree-hal-configuration-pipeline",
- "Runs the IREE HAL dialect configuration pipeline",
+ "Runs HAL target configuration pipeline.",
[](OpPassManager &passManager) {
buildHALConfigurationPassPipeline(
passManager,
TargetBackendRegistry::getGlobal(),
TargetOptions::FromFlags::get());
});
-}
-
-void registerHALTransformPassPipeline() {
PassPipelineRegistration<TransformOptions>(
"iree-hal-transformation-pipeline",
- "Runs the full IREE HAL dialect transformation pipeline",
+ "Runs the full IREE HAL conversion/lowering pipeline.",
[](OpPassManager &passManager, const TransformOptions &transformOptions) {
buildHALTransformPassPipeline(
passManager, TargetBackendRegistry::getGlobal(),
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.h b/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.h
index 97778d1..18050b9 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.h
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.h
@@ -20,7 +20,7 @@
namespace mlir::iree_compiler::IREE::HAL {
//===----------------------------------------------------------------------===//
-// Helpers
+// Pipelines
//===----------------------------------------------------------------------===//
enum class PipelinePhase {
@@ -37,6 +37,13 @@
End,
};
+// Adds a set of passes to the given pass manager that run the head of the HAL
+// pipeline to assign devices, materialize interfaces, and translate
+// executables. The host portion of the program is annotated but not modified.
+void buildHALConfigurationPassPipeline(
+ OpPassManager &passManager, const TargetBackendRegistry &targetRegistry,
+ const TargetOptions &targetOptions);
+
// Adds a set of passes to the given pass manager that run the required HAL
// transforms in the canonical order.
//
@@ -53,193 +60,22 @@
PipelinePhase compileFrom = PipelinePhase::Start,
PipelinePhase compileTo = PipelinePhase::End);
-// Adds a set of passes to the given pass manager that run the head of the HAL
-// pipeline to assign devices, materialize interfaces, and translate
-// executables. The host portion of the program is annotated but not modified.
-void buildHALConfigurationPassPipeline(
- OpPassManager &passManager, const TargetBackendRegistry &targetRegistry,
- const TargetOptions &targetOptions);
-
-void registerHALTransformPassPipeline();
-void registerHALConfigurationPassPipeline();
-
//===----------------------------------------------------------------------===//
-// Conversion
+// Passes
//===----------------------------------------------------------------------===//
-// Converts input flow/std/etc dialects to the IREE HAL dialect.
-std::unique_ptr<OperationPass<mlir::ModuleOp>> createConvertToHALPass();
-
-//===----------------------------------------------------------------------===//
-// Device management
-//===----------------------------------------------------------------------===//
-
-// Verifies that the target execution environment is valid.
-// #hal.device.target and #hal.executable.target attribute placement and
-// definition will be checked as well along with other structural requirements.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createVerifyTargetEnvironmentPass(const TargetBackendRegistry &targetRegistry);
-
-// Assigns the HAL devices the module will target to the given list of targets.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createAssignTargetDevicesPass(const TargetBackendRegistry &targetRegistry,
- ArrayRef<std::string> targets);
-
-// Applies fixups to the program for when using legacy HAL devices that only
-// support synchronous execution. Once all devices support async this will be
-// removed.
-std::unique_ptr<OperationPass<mlir::ModuleOp>> createFixupLegacySyncPass();
-
-// Finds hal.device.query ops and creates variables initialized on startup.
-std::unique_ptr<OperationPass<mlir::ModuleOp>> createMemoizeDeviceQueriesPass();
-
-//===----------------------------------------------------------------------===//
-// Executable translation
-//===----------------------------------------------------------------------===//
-
-// Defines hal.executables and hal.interfaces for flow.executable ops based on
-// usage within the module. Target backends are queried to check for support and
-// device placements are made.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createMaterializeInterfacesPass();
-
-// Dumps individual hal.executable source listings to |path|.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createDumpExecutableSourcesPass(StringRef path, StringRef prefix = "");
-
-// Dumps standalone hal.executable benchmarks to |path|.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createDumpExecutableBenchmarksPass(StringRef path);
-
-// Strips executable module contents for reducing IR size during debugging.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createStripExecutableContentsPass();
-
-// Substitutes hal.executable ops by parsing |substitutions| in
-// `executable_name=file.xxx` strings. File paths may be absolute or relative to
-// the paths specified on `--iree-hal-executable-object-search-path=`.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createSubstituteExecutablesPass(ArrayRef<std::string> substitutions = {});
-// Substitutes hal.executable ops with files in the given |searchPath| matching
-// the symbol name.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createSubstituteExecutablesPass(std::string searchPath);
-
-// Preprocess each executable with either a pass pipeline or external tool.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createPreprocessExecutablesPass(std::string command);
-// Preprocesses each executable with a pass pipeline.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createPreprocessExecutablesWithPipelinePass(std::string pipeline);
-// Preprocesses each executable with an external tool.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createPreprocessExecutablesWithToolPass(std::string command);
-
-// Configures hal.executable.variant ops in all hal.executable ops via a nested
-// translation pipeline.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createConfigureExecutablesPass(const TargetBackendRegistry &targetRegistry);
-
-// Configures hal.executable.variant ops for the specified |target| backend.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableVariantOp>>
-createConfigureTargetExecutableVariantsPass(
- const TargetBackendRegistry &targetRegistry, StringRef target);
-
-// Translates hal.executable.variant ops via a nested translation pipeline.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createTranslateExecutablesPass(const TargetBackendRegistry &targetRegistry);
-
-// Translates hal.executable.variant ops for the specified |target| backend.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableVariantOp>>
-createTranslateTargetExecutableVariantsPass(
- const TargetBackendRegistry &targetRegistry, StringRef target);
-
-// Calls into each target backend to have it link multiple hal.executables
-// together (if that makes sense). For example, the LLVM AOT backend may combine
-// all executable targets for the same architecture into a single executable and
-// link it as a shared library.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createLinkExecutablesPass(const TargetBackendRegistry &targetRegistry);
-
-// Links executables for the specified |target| backend.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createLinkTargetExecutablesPass(const TargetBackendRegistry &targetRegistry,
- StringRef target);
-
-// Resolves hal.executable.export references to ordinals.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createResolveExportOrdinalsPass();
-
-// Converts hal.executable.variants to one or more hal.executable.binary ops.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createSerializeExecutablesPass(const TargetBackendRegistry &targetRegistry,
- int debugLevel = 2,
- std::string dumpIntermediatesPath = "",
- std::string dumpBinariesPath = "");
-
-// Serializes executables for the specified |target| backend.
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createSerializeTargetExecutablesPass(
- const TargetBackendRegistry &targetRegistry, StringRef target,
- int debugLevel = 2, std::string dumpIntermediatesPath = "",
- std::string dumpBinariesPath = "");
-
-//===----------------------------------------------------------------------===//
-// Resource initialization, caching, and optimization
-//===----------------------------------------------------------------------===//
-
-// Materializes host and device dispatch instrumentation resources on stream IR.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createMaterializeDispatchInstrumentationPass(int64_t bufferSize);
-
-// Finds all resource lookups (such as hal.executable.lookup), materializes
-// their cache storage and initialization, and rewrites the lookups to
-// references.
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createMaterializeResourceCachesPass(TargetOptions targetOptions);
-
-// Elides stateful command buffer ops that set redundant state.
-std::unique_ptr<OperationPass<void>> createElideRedundantCommandsPass();
-
-// Repeats dispatches `iree-hal-repeat-dispatch-num` times, which is 1 by
-// default.
-std::unique_ptr<OperationPass<func::FuncOp>>
-createBenchmarkBatchDispatchesPass(unsigned repeatCount);
+// Preprocesses each executable with an MLIR pass pipeline or external command
+// line tool.
+std::unique_ptr<Pass> createPreprocessExecutablesPass(std::string command = "");
//===----------------------------------------------------------------------===//
// Register all Passes
//===----------------------------------------------------------------------===//
-inline void registerHALPasses() {
- registerHALTransformPassPipeline();
- registerHALConfigurationPassPipeline();
- auto targetOptions = TargetOptions::FromFlags::get();
- createAssignTargetDevicesPass(TargetBackendRegistry::getGlobal(), {});
- createBenchmarkBatchDispatchesPass(/*repeatCount=*/1);
- createConfigureExecutablesPass(TargetBackendRegistry::getGlobal());
- createConfigureTargetExecutableVariantsPass(
- TargetBackendRegistry::getGlobal(), "");
- createConvertToHALPass();
- createDumpExecutableSourcesPass("");
- createElideRedundantCommandsPass();
- createFixupLegacySyncPass();
- createLinkExecutablesPass(TargetBackendRegistry::getGlobal());
- createLinkTargetExecutablesPass(TargetBackendRegistry::getGlobal(), "");
- createMaterializeDispatchInstrumentationPass(0);
- createMaterializeInterfacesPass();
- createMaterializeResourceCachesPass(targetOptions);
- createMemoizeDeviceQueriesPass();
- createPreprocessExecutablesPass("");
- createResolveExportOrdinalsPass();
- createSerializeExecutablesPass(TargetBackendRegistry::getGlobal());
- createSerializeTargetExecutablesPass(TargetBackendRegistry::getGlobal(), "");
- createStripExecutableContentsPass();
- createSubstituteExecutablesPass();
- createTranslateExecutablesPass(TargetBackendRegistry::getGlobal());
- createTranslateTargetExecutableVariantsPass(
- TargetBackendRegistry::getGlobal(), "");
- createVerifyTargetEnvironmentPass(TargetBackendRegistry::getGlobal());
-}
+#define GEN_PASS_DECL
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc" // IWYU pragma: keep
+
+void registerHALPasses();
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.td b/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.td
new file mode 100644
index 0000000..0c8f376
--- /dev/null
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/Passes.td
@@ -0,0 +1,562 @@
+// Copyright 2023 The IREE Authors
+//
+// Licensed 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
+
+#ifndef IREE_DIALECT_HAL_PASSES
+#define IREE_DIALECT_HAL_PASSES
+
+include "mlir/Pass/PassBase.td"
+
+//===----------------------------------------------------------------------===//
+// Conversion
+//===----------------------------------------------------------------------===//
+
+def ConvertToHALPass :
+ Pass<"iree-hal-conversion", "mlir::ModuleOp"> {
+ let summary = "Converts from stream and other intermediate dialects into the hal dialect.";
+ let description = [{
+ Converts supported intermediate dialects (`stream`, `util`, and various
+ upstream dialects like `cf`/`scf`) into the hal dialect. After conversion
+ host code scheduling work and allocations will act on `!hal.device` queues
+ and `!hal.buffer` (and other) resources.
+
+ It's expected that executable interface materialization has been performed
+ so that the information required to marshal buffers and operands to the
+ device is available for conversion.
+ }];
+ let dependentDialects = [
+ "mlir::arith::ArithDialect",
+ "mlir::func::FuncDialect",
+ "mlir::scf::SCFDialect",
+ "IREE::HAL::HALDialect",
+ "IREE::Stream::StreamDialect",
+ "IREE::Util::UtilDialect",
+ // TODO(benvanik): add a registration system for extra dialects?
+ "IREE::IO::Parameters::IOParametersDialect",
+ ];
+}
+
+//===----------------------------------------------------------------------===//
+// Device management
+//===----------------------------------------------------------------------===//
+
+def VerifyTargetEnvironmentPass :
+ Pass<"iree-hal-verify-target-environment", "mlir::ModuleOp"> {
+ let summary = "Verifies that the target execution environment is valid.";
+ let description = [{
+ Verifies that the target execution environment is valid.
+ `#hal.device.target` and `#hal.executable.target` attribute placement and
+ definition will be checked that they reference the available target backends
+ and that they are structurally valid.
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ ];
+}
+
+def AssignTargetDevicesPass :
+ Pass<"iree-hal-assign-target-devices", "mlir::ModuleOp"> {
+ let summary = "Assigns the HAL devices the module will target to the given list of targets.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ ListOption<
+ "targets", "targets",
+ "std::string",
+ "List of devices to assign as targets."
+ >,
+ ];
+}
+
+def FixupLegacySyncPass :
+ Pass<"iree-hal-fixup-legacy-sync", "mlir::ModuleOp"> {
+ let summary = "Applies fixups to the program for when using legacy HAL devices.";
+ let description = [{
+ Applies fixups to the program for when using legacy HAL devices that only
+ support synchronous execution. Once all devices support async this will be
+ removed.
+
+ NOTE: this pass only exists for backwards compatibility with legacy HAL
+ drivers. It will be removed once all have migrated to the modern async APIs.
+ }];
+ let dependentDialects = [
+ "mlir::arith::ArithDialect",
+ "IREE::HAL::HALDialect",
+ "IREE::Util::UtilDialect",
+ ];
+}
+
+def MemoizeDeviceQueriesPass :
+ Pass<"iree-hal-memoize-device-queries", "mlir::ModuleOp"> {
+ let summary = "Finds hal.device.query ops and creates variables initialized on startup.";
+ let description = [{
+ Finds all `hal.device.query`-related ops that are hoistable and moves them
+ into globals that are initialized on startup. This prevents repeated queries
+ at runtime and allows for optimization as queries are CSEd across the entire
+ program.
+ }];
+ let dependentDialects = [
+ "mlir::arith::ArithDialect",
+ "IREE::HAL::HALDialect",
+ "IREE::Util::UtilDialect",
+ ];
+}
+
+//===----------------------------------------------------------------------===//
+// Executable translation
+//===----------------------------------------------------------------------===//
+
+def MaterializeInterfacesPass :
+ Pass<"iree-hal-materialize-interfaces", "mlir::ModuleOp"> {
+ let summary = "Defines hal.executable variants for stream.executable ops.";
+ let description = [{
+ Defines hal.executables and one hal.variant for each required target. The
+ interfaces required to marshal buffers and operands across the host-device
+ boundary are declared on the executables and annotated on the dispatch
+ sites so that subsequent conversion can consume them.
+ }];
+ let dependentDialects = [
+ "mlir::arith::ArithDialect",
+ "IREE::HAL::HALDialect",
+ ];
+}
+
+def SubstituteExecutablesPass :
+ Pass<"iree-hal-substitute-executables", "mlir::ModuleOp"> {
+ let summary = "Substitutes hal.executable ops with files on disk.";
+ let description = [{
+ Substitutes hal.executable ops with externally referenced MLIR files or
+ target-specific object files. When provided a .mlir/.mlirbc file with a
+ top-level hal.executable the entire executable will be replaced including
+ all variants contained with. All other files such as .o, .bc, and .spv will
+ be set as external object files on the original executable variants and the
+ original contents will be dropped.
+
+ Substitutions can be specified by providing a file system path where there
+ exists files matching the executable names in one of the supported formats
+ or by specifying the file each executable name maps to directly.
+ }];
+ let options = [
+ ListOption<
+ "substitutions", "substitutions",
+ "std::string",
+ "Substitution `executable_name=file.xxx` key-value pairs."
+ >,
+ Option<
+ "searchPath", "search-path",
+ "std::string", "",
+ "Path to source executable substitutions from."
+ >,
+ ];
+ let dependentDialects = [
+ // NOTE: we may need more for anything we load from MLIR files.
+ "IREE::HAL::HALDialect",
+ ];
+}
+
+def PreprocessExecutablesWithPipelinePass :
+ Pass<"iree-hal-preprocess-executables-with-pipeline", "IREE::HAL::ExecutableOp"> {
+ let summary = "Preprocess each executable with an MLIR pass pipeline.";
+ let description = [{
+ Runs the given MLIR pass pipeline as parsed by the `--pass-pipeline=` flag
+ on each hal.executable in the program. The passes must be linked into the
+ compiler to be discovered.
+ }];
+ let options = [
+ Option<
+ "pipeline", "pipeline",
+ "std::string", "",
+ "MLIR pass pipeline description to run on each executable."
+ >,
+ ];
+}
+
+def PreprocessExecutablesWithToolPass :
+ Pass<"iree-hal-preprocess-executables-with-tool", "IREE::HAL::ExecutableOp"> {
+ let summary = "Preprocess each executable with an external command line tool.";
+ let description = [{
+ Passes each hal.executable in the program to the given command line tool
+ as stdin and parses the resulting MLIR from stdout to replace them. This
+ is equivalent to `iree-hal-preprocess-executables-with-pipeline` but allows
+ for an external `mlir-opt`/`iree-opt`-like tool to be used containing the
+ pipelines instead of requiring the passes to be linked into the compiler.
+ }];
+ let options = [
+ Option<
+ "command", "command",
+ "std::string", "",
+ "stdin->stdout command to run on each hal.executable MLIR op."
+ >,
+ ];
+}
+
+def ConfigureExecutablesPass :
+ Pass<"iree-hal-configure-executables", "IREE::HAL::ExecutableOp"> {
+ let summary = "Configures hal.executable ops via a nested translation pipeline.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ ];
+}
+
+def ConfigureTargetExecutableVariantsPass :
+ Pass<"iree-hal-configure-target-executable-variants", "IREE::HAL::ExecutableVariantOp"> {
+ let summary = "Configures hal.executable.variant ops for the specified target backend.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ Option<
+ "target", "target",
+ "std::string", "",
+ "Target backend name whose executable variants will be configured by this pass."
+ >,
+ ];
+}
+
+def TranslateExecutablesPass :
+ Pass<"iree-hal-translate-executables", "IREE::HAL::ExecutableOp"> {
+ let summary = "Translates hal.executable ops via a nested translation pipeline.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ ];
+}
+
+def TranslateTargetExecutableVariantsPass :
+ Pass<"iree-hal-translate-target-executable-variants", "IREE::HAL::ExecutableVariantOp"> {
+ let summary = "Translates hal.executable.variant ops for the specified target backend.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ Option<
+ "target", "target",
+ "std::string", "",
+ "Target backend name whose executable variants will be translated by this pass."
+ >,
+ ];
+}
+
+def LinkExecutablesPass :
+ Pass<"iree-hal-link-executables", "mlir::ModuleOp"> {
+ let summary = "Links hal.executable ops into one or more hal.executable ops.";
+ let description = [{
+ Calls into each target backend to have it link multiple `hal.executable` ops
+ together (if the backend desires).
+
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ ];
+}
+
+def LinkTargetExecutablesPass :
+ Pass<"iree-hal-link-target-executables", "mlir::ModuleOp"> {
+ let summary = "Links executables for the specified target backend.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ Option<
+ "target", "target",
+ "std::string", "",
+ "Target backend name whose executables will be linked by this pass."
+ >,
+ ];
+}
+
+def ResolveExportOrdinalsPass :
+ Pass<"iree-hal-resolve-export-ordinals", "mlir::ModuleOp"> {
+ let summary = "Resolves symbolic hal.executable.export references to ordinals.";
+ let description = [{
+ Severs symbolic references to hal.executable.export ops from dispatch sites
+ by replacing them with the ordinal assigned to the exports. This allows for
+ subsequent passes to collapse the executables into opaque blobs.
+ }];
+ let dependentDialects = [
+ "IREE::HAL::HALDialect",
+ ];
+}
+
+def SerializeExecutablesPass :
+ Pass<"iree-hal-serialize-executables", "IREE::HAL::ExecutableOp"> {
+ let summary = "Converts hal.executable.variants to one or more hal.executable.binary ops.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ Option<
+ "debugLevel", "debug-level",
+ "int", "2",
+ "Debug level for serialization (0 (no information) to 3 (all information))."
+ >,
+ Option<
+ "dumpIntermediatesPath", "dump-intermediates-path",
+ "std::string", "",
+ "Path to write translated executable intermediates (.bc, .o, etc) into for debugging."
+ >,
+ Option<
+ "dumpBinariesPath", "dump-binaries-path",
+ "std::string", "",
+ "Path to write translated and serialized executable binaries into for debugging."
+ >,
+ ];
+}
+
+def SerializeTargetExecutablesPass :
+ Pass<"iree-hal-serialize-target-executables", "IREE::HAL::ExecutableOp"> {
+ let summary = "Serializes executables for the specified target backend.";
+ let description = [{
+ DO NOT SUBMIT
+ }];
+ let options = [
+ Option<
+ "targetRegistry", "target-registry",
+ "llvm::cl::TargetBackendRegistryRef", "",
+ "Target backend registry containing the list of available backends."
+ >,
+ Option<
+ "target", "target",
+ "std::string", "",
+ "Target backend name whose executables will be serialized by this pass."
+ >,
+ Option<
+ "debugLevel", "debug-level",
+ "int", "2",
+ "Debug level for serialization (0 (no information) to 3 (all information))."
+ >,
+ Option<
+ "dumpIntermediatesPath", "dump-intermediates-path",
+ "std::string", "",
+ "Path to write translated executable intermediates (.bc, .o, etc) into for debugging."
+ >,
+ Option<
+ "dumpBinariesPath", "dump-binaries-path",
+ "std::string", "",
+ "Path to write translated and serialized executable binaries into for debugging."
+ >,
+ ];
+}
+
+//===----------------------------------------------------------------------===//
+// Resource initialization, caching, and optimization
+//===----------------------------------------------------------------------===//
+
+def MaterializeDispatchInstrumentationPass :
+ Pass<"iree-hal-materialize-dispatch-instrumentation", "mlir::ModuleOp"> {
+ let summary = "Materializes host and device dispatch instrumentation resources on stream IR.";
+ let description = [{
+ Adds dispatch instrumentation for both host and device prior to
+ materializing interfaces so that the higher-level stream dialect can be used
+ to easily mutate the dispatch sites, executable exports, and resources used
+ for instrumentation storage.
+ }];
+ let options = [
+ Option<
+ "bufferSize", "buffer-size",
+ "llvm::cl::PowerOf2ByteSize", "llvm::cl::PowerOf2ByteSize(64 * 1024 * 1024)",
+ "Power-of-two byte size of the instrumentation buffer."
+ >,
+ ];
+ let dependentDialects = [
+ "mlir::arith::ArithDialect",
+ "mlir::func::FuncDialect",
+ "IREE::HAL::HALDialect",
+ "IREE::Stream::StreamDialect",
+ "IREE::Util::UtilDialect",
+ ];
+}
+
+def MaterializeResourceCachesPass :
+ Pass<"iree-hal-materialize-resource-caches", "mlir::ModuleOp"> {
+ let summary = "Materializes cached globals for device resources.";
+ let description = [{
+ Scans the program for resource lookups such as `hal.executable.lookup` and
+ materializes globals initialized on startup. The original lookup ops are
+ replaced with global loads of the cached resources.
+ }];
+ let dependentDialects = [
+ "mlir::arith::ArithDialect",
+ "mlir::func::FuncDialect",
+ "mlir::scf::SCFDialect",
+ "IREE::HAL::HALDialect",
+ "IREE::Util::UtilDialect",
+ ];
+}
+
+def ElideRedundantCommandsPass :
+ Pass<"iree-hal-elide-redundant-commands", ""> {
+ let summary = "Elides stateful command buffer ops that set redundant state.";
+ let description = [{
+ Identifies sequences of stateful command buffer operations such as
+ `hal.command_buffer.push_descriptor_set` that set redundant state that arise
+ from trivial conversion from the stateless stream dialect and removes them
+ to reduce binary size and runtime overhead.
+ }];
+ let dependentDialects = [
+ "IREE::HAL::HALDialect",
+ ];
+}
+
+//===----------------------------------------------------------------------===//
+// Benchmarking and debugging utilities
+//===----------------------------------------------------------------------===//
+
+def DumpExecutableSourcesPass :
+ Pass<"iree-hal-dump-executable-sources", "mlir::ModuleOp"> {
+ let summary = "Dumps individual hal.executable source listings to the provided path.";
+ let description = [{
+ Dumps a source listing of each hal.executable and updates the source
+ locations in the IR to point at the produced files. This allows for easy
+ inspection of each executable prior to translation and gives downstream
+ tools that can display source information (Tracy, perf, etc) something more
+ useful than the entire original source program.
+ }];
+ let options = [
+ Option<
+ "path", "path",
+ "std::string", "",
+ "File system path to write each executable source MLIR file."
+ >,
+ Option<
+ "prefix", "prefix",
+ "std::string", "",
+ "String to prefix the written file names with."
+ >,
+ ];
+}
+
+def DumpExecutableBenchmarksPass :
+ Pass<"iree-hal-dump-executable-benchmarks", "mlir::ModuleOp"> {
+ let summary = "Dumps standalone hal.executable benchmarks to the provided path.";
+ let description = [{
+ Dumps one MLIR file per hal.executable containing the executable contents
+ and the host code required to dispatch them with fake buffers and operands.
+ These benchmarks can be run with the `iree-benchmark-module` tool to
+ microbenchmark individual dispatches outside of the whole program context.
+
+ The pass can only be run after executable translation but before host code
+ conversion as the original stream dialect ops are required to synthesize
+ the benchmarks.
+
+ There are many caveats with this approach and it will fail to generate
+ benchmarks in many cases such as dynamic shapes, dynamic operands, or
+ stateful data dependencies. Users should always prefer to build dedicated
+ benchmarks in their origin framework that can be guaranteed to match their
+ expectations and use appropriate test data. For example some dispatches may
+ produce NaNs or out-of-bounds accesses with the fake data generated by this
+ pass and either crash or result in unrepresentative performance.
+
+ In other words: don't blindly expect this pass to do anything but act as a
+ starting point for microbenchmarking. Verify the outputs, the benchmarking
+ methodology for the particular dispatch, and prepare to do more work. Or
+ just author proper benchmarks in the original framework!
+ }];
+ let options = [
+ Option<
+ "path", "path",
+ "std::string", "",
+ "File system path to write each executable benchmark MLIR file."
+ >,
+ ];
+ let dependentDialects = [
+ "mlir::arith::ArithDialect",
+ "mlir::func::FuncDialect",
+ "mlir::scf::SCFDialect",
+ "IREE::HAL::HALDialect",
+ "IREE::Util::UtilDialect",
+ ];
+}
+
+def StripExecutableContentsPass :
+ Pass<"iree-hal-strip-executable-contents", "mlir::ModuleOp"> {
+ let summary = "Strips executable module contents for reducing IR size during debugging.";
+ let description = [{
+ A debugging pass for stripping translated executable contents (LLVM dialect,
+ SPIR-V dialect, etc) to reduce IR size and noise from the device-only code.
+ }];
+}
+
+def RepeatDispatchesPass :
+ Pass<"iree-hal-repeat-dispatches", ""> {
+ let summary = "Repeats each hal.command_buffer.dispatch op one or more times.";
+ let description = [{
+ Finds all hal.command_buffer.dispatch ops and repeats them the specified
+ number of times by cloning them and inserting a barrier. This is extremely
+ unreliable and nearly always creates incorrect programs that have wildly
+ incorrect end-to-end execution timings. It must only be used when trying to
+ profile (via sampling or performance counters) specific dispatches in-situ
+ with the additional caveat that cache behavior and dispatch overhead are
+ invalid. Do not trust any numbers produced by this method of benchmarking
+ without verifying via external tooling.
+
+ This should rarely be used. Prefer instead to build real benchmarks in
+ origin frameworks that, for example, use independent data and ensure correct
+ execution results (as if you're benchmarking known-incorrect results, are
+ you really benchmarking something useful?). Any benchmarking of memory-bound
+ operations using this approach will be questionable (such as matmuls, which
+ we use this for today... heh ;).
+ }];
+ let options = [
+ Option<
+ "repeatCount", "count",
+ "unsigned", "1",
+ "Number of times to repeat each dispatch (including the original)."
+ >,
+ ];
+ let dependentDialects = [
+ "IREE::HAL::HALDialect",
+ ];
+}
+
+#endif // IREE_DIALECT_HAL_PASSES
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/PreprocessExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/PreprocessExecutables.cpp
index b668c25..b1c96ba 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/PreprocessExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/PreprocessExecutables.cpp
@@ -27,6 +27,12 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_PREPROCESSEXECUTABLESWITHPIPELINEPASS
+#define GEN_PASS_DEF_PREPROCESSEXECUTABLESWITHTOOLPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
static StringRef fixupArg(StringRef arg) {
// HACK: pass pipeline parsing doesn't handle strings with spaces and the only
// way to get them through (I could find) is to double quote them. This
@@ -212,20 +218,16 @@
return success();
}
-class PreprocessExecutablesPass
- : public PassWrapper<PreprocessExecutablesPass,
- OperationPass<IREE::HAL::ExecutableOp>> {
-public:
- PreprocessExecutablesPass() = default;
- PreprocessExecutablesPass(const PreprocessExecutablesPass &pass) {}
- PreprocessExecutablesPass(std::optional<std::string> pipeline,
- std::optional<std::string> command) {
- if (pipeline.has_value()) {
- this->pipeline = std::move(pipeline).value();
- } else if (command.has_value()) {
- this->command = std::move(command).value();
- }
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-preprocess-executables-with-pipeline
+//===----------------------------------------------------------------------===//
+
+struct PreprocessExecutablesWithPipelinePass
+ : public IREE::HAL::impl::PreprocessExecutablesWithPipelinePassBase<
+ PreprocessExecutablesWithPipelinePass> {
+ using IREE::HAL::impl::PreprocessExecutablesWithPipelinePassBase<
+ PreprocessExecutablesWithPipelinePass>::
+ PreprocessExecutablesWithPipelinePassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
@@ -239,79 +241,56 @@
}
}
- StringRef getArgument() const override {
- return "iree-hal-preprocess-executables";
- }
-
- StringRef getDescription() const override {
- return "Preprocesses each executable with a pass pipeline or external "
- "tool.";
- }
-
void runOnOperation() override {
+ if (!pipeline.hasValue())
+ return;
auto executableOp = getOperation();
- if (pipeline.hasValue()) {
- OpPassManager passManager(executableOp.getOperationName());
- if (failed(buildPassPipeline(pipeline, passManager))) {
- llvm::errs() << "ERROR: failed to parse preprocessing pipeline `"
- << pipeline << "`\n";
- return signalPassFailure();
- }
- if (failed(runPipeline(passManager, executableOp))) {
- llvm::errs() << "ERROR: failed to preprocess executable `"
- << executableOp.getName() << "` using pipeline `"
- << pipeline << "`\n";
- return signalPassFailure();
- }
- } else if (command.hasValue()) {
- if (failed(preprocessWithCommand(executableOp, command))) {
- llvm::errs() << "ERROR: failed to preprocess executable `"
- << executableOp.getName() << "` using command `" << command
- << "`\n";
- return signalPassFailure();
- }
+ OpPassManager passManager(executableOp.getOperationName());
+ if (failed(buildPassPipeline(pipeline, passManager))) {
+ llvm::errs() << "ERROR: failed to parse preprocessing pipeline `"
+ << pipeline << "`\n";
+ return signalPassFailure();
+ }
+ if (failed(runPipeline(passManager, executableOp))) {
+ llvm::errs() << "ERROR: failed to preprocess executable `"
+ << executableOp.getName() << "` using pipeline `" << pipeline
+ << "`\n";
+ return signalPassFailure();
}
}
-
-private:
- Option<std::string> pipeline{
- *this,
- "pipeline",
- llvm::cl::desc("Pass pipeline used to preprocess the executable."),
- llvm::cl::init(""),
- };
- Option<std::string> command{
- *this,
- "command",
- llvm::cl::desc("Shell command used to preprocess the executable."),
- llvm::cl::init(""),
- };
};
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createPreprocessExecutablesPass(std::string rawCommand) {
+//===----------------------------------------------------------------------===//
+// --iree-hal-preprocess-executables-with-tool
+//===----------------------------------------------------------------------===//
+
+struct PreprocessExecutablesWithToolPass
+ : public IREE::HAL::impl::PreprocessExecutablesWithToolPassBase<
+ PreprocessExecutablesWithToolPass> {
+ using IREE::HAL::impl::PreprocessExecutablesWithToolPassBase<
+ PreprocessExecutablesWithToolPass>::PreprocessExecutablesWithToolPassBase;
+ void runOnOperation() override {
+ if (!command.hasValue())
+ return;
+ auto executableOp = getOperation();
+ if (failed(preprocessWithCommand(executableOp, command))) {
+ llvm::errs() << "ERROR: failed to preprocess executable `"
+ << executableOp.getName() << "` using command `" << command
+ << "`\n";
+ return signalPassFailure();
+ }
+ }
+};
+
+} // namespace
+
+std::unique_ptr<Pass> createPreprocessExecutablesPass(std::string rawCommand) {
auto command = fixupArg(rawCommand);
if (command.starts_with("builtin.module")) {
- return createPreprocessExecutablesWithPipelinePass(command.str());
+ return createPreprocessExecutablesWithPipelinePass({command.str()});
} else {
- return createPreprocessExecutablesWithToolPass(command.str());
+ return createPreprocessExecutablesWithToolPass({command.str()});
}
}
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createPreprocessExecutablesWithPipelinePass(std::string pipeline) {
- return std::make_unique<PreprocessExecutablesPass>(std::move(pipeline),
- std::nullopt);
-}
-
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createPreprocessExecutablesWithToolPass(std::string command) {
- return std::make_unique<PreprocessExecutablesPass>(std::nullopt,
- std::move(command));
-}
-
-static PassRegistration<PreprocessExecutablesPass> pass([] {
- return std::make_unique<PreprocessExecutablesPass>();
-});
-
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/RepeatDispatches.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/RepeatDispatches.cpp
new file mode 100644
index 0000000..d7ee923
--- /dev/null
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/RepeatDispatches.cpp
@@ -0,0 +1,58 @@
+// Copyright 2021 The IREE Authors
+//
+// Licensed 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
+
+#include "iree/compiler/Dialect/HAL/IR/HALDialect.h"
+#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
+#include "iree/compiler/Dialect/HAL/IR/HALTypes.h"
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
+#include "mlir/Pass/Pass.h"
+
+namespace mlir::iree_compiler::IREE::HAL {
+
+#define GEN_PASS_DEF_REPEATDISPATCHESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
+//===----------------------------------------------------------------------===//
+// --iree-hal-repeat-dispatches
+//===----------------------------------------------------------------------===//
+
+struct RepeatDispatchesPass
+ : public IREE::HAL::impl::RepeatDispatchesPassBase<RepeatDispatchesPass> {
+ using IREE::HAL::impl::RepeatDispatchesPassBase<
+ RepeatDispatchesPass>::RepeatDispatchesPassBase;
+ void runOnOperation() override {
+ // Collect all (nested) command buffer dispatch ops.
+ SmallVector<IREE::HAL::CommandBufferDispatchOp> ops;
+ getOperation()->walk(
+ [&ops](IREE::HAL::CommandBufferDispatchOp op) { ops.push_back(op); });
+ for (auto op : ops) {
+ OpBuilder builder(op);
+ for (unsigned i = 1; i < repeatCount; ++i) {
+ // Clone the op at its original location in the IR.
+ builder.clone(*op.getOperation());
+ // Add a barrier after each clone. If the original dispatch has a small
+ // problem size, simply duplicating without barrier will increase the
+ // number of subgroups and thus "help" filling the GPU. In the end we
+ // will have an over optimistic result. Inserting barriers avoids that,
+ // but it assumes that the command buffer has a linear dispatch
+ // structure.
+ builder.create<IREE::HAL::CommandBufferExecutionBarrierOp>(
+ op.getLoc(), op.getCommandBuffer(),
+ IREE::HAL::ExecutionStageBitfield::CommandRetire |
+ IREE::HAL::ExecutionStageBitfield::Dispatch,
+ IREE::HAL::ExecutionStageBitfield::CommandIssue |
+ IREE::HAL::ExecutionStageBitfield::Dispatch,
+ IREE::HAL::ExecutionBarrierFlagBitfield::None);
+ }
+ }
+ }
+};
+
+} // namespace
+
+} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ResolveExportOrdinals.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ResolveExportOrdinals.cpp
index c96819a..7d30bb1 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/ResolveExportOrdinals.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/ResolveExportOrdinals.cpp
@@ -4,6 +4,7 @@
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#include "iree/compiler/Dialect/HAL/IR/HALDialect.h"
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
#include "mlir/Pass/Pass.h"
@@ -11,9 +12,13 @@
namespace mlir::iree_compiler::IREE::HAL {
-class ResolveCommandBufferDispatchOrdinals
+#define GEN_PASS_DEF_RESOLVEEXPORTORDINALSPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
+struct ResolveCommandBufferDispatchOrdinals
: public OpRewritePattern<IREE::HAL::CommandBufferDispatchSymbolOp> {
-public:
using OpRewritePattern<
IREE::HAL::CommandBufferDispatchSymbolOp>::OpRewritePattern;
LogicalResult matchAndRewrite(IREE::HAL::CommandBufferDispatchSymbolOp op,
@@ -39,10 +44,9 @@
}
};
-class ResolveCommandBufferDispatchIndirectOrdinals
+struct ResolveCommandBufferDispatchIndirectOrdinals
: public OpRewritePattern<
IREE::HAL::CommandBufferDispatchIndirectSymbolOp> {
-public:
using OpRewritePattern<
IREE::HAL::CommandBufferDispatchIndirectSymbolOp>::OpRewritePattern;
LogicalResult
@@ -69,17 +73,13 @@
}
};
-class ResolveExportOrdinalsPass
- : public PassWrapper<ResolveExportOrdinalsPass, OperationPass<ModuleOp>> {
-public:
- StringRef getArgument() const override {
- return "iree-hal-resolve-export-ordinals";
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-resolve-export-ordinals
+//===----------------------------------------------------------------------===//
- StringRef getDescription() const override {
- return "Resolves hal.executable.export references to ordinals";
- }
-
+struct ResolveExportOrdinalsPass
+ : public IREE::HAL::impl::ResolveExportOrdinalsPassBase<
+ ResolveExportOrdinalsPass> {
void runOnOperation() override {
MLIRContext *context = &getContext();
RewritePatternSet patterns(&getContext());
@@ -92,10 +92,6 @@
}
};
-std::unique_ptr<OperationPass<ModuleOp>> createResolveExportOrdinalsPass() {
- return std::make_unique<ResolveExportOrdinalsPass>();
-}
-
-static PassRegistration<ResolveExportOrdinalsPass> pass;
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/SerializeExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/SerializeExecutables.cpp
index 4b2b5c2..99a7df0 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/SerializeExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/SerializeExecutables.cpp
@@ -11,6 +11,8 @@
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Target/TargetBackend.h"
#include "iree/compiler/Dialect/HAL/Target/TargetRegistry.h"
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
+#include "iree/compiler/Utils/TracingUtils.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Support/FileSystem.h"
#include "mlir/IR/Attributes.h"
@@ -21,36 +23,25 @@
namespace mlir::iree_compiler::IREE::HAL {
-class SerializeTargetExecutablesPass
- : public PassWrapper<SerializeTargetExecutablesPass,
- OperationPass<IREE::HAL::ExecutableOp>> {
-public:
- SerializeTargetExecutablesPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- SerializeTargetExecutablesPass(const SerializeTargetExecutablesPass &pass)
- : targetRegistry(pass.targetRegistry) {}
- SerializeTargetExecutablesPass(const TargetBackendRegistry &targetRegistry,
- StringRef target, int debugLevel,
- std::string dumpIntermediatesPath,
- std::string dumpBinariesPath)
- : targetRegistry(targetRegistry) {
- this->target = target.str();
- this->debugLevel = debugLevel;
- this->dumpIntermediatesPath = dumpIntermediatesPath;
- this->dumpBinariesPath = dumpBinariesPath;
- }
+#define GEN_PASS_DEF_SERIALIZEEXECUTABLESPASS
+#define GEN_PASS_DEF_SERIALIZETARGETEXECUTABLESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
- StringRef getArgument() const override {
- return "iree-hal-serialize-target-executables";
- }
+namespace {
- StringRef getDescription() const override {
- return "Serializes hal.executable.variant ops to hal.executable.binary ops";
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-serialize-target-executables
+//===----------------------------------------------------------------------===//
+
+struct SerializeTargetExecutablesPass
+ : public IREE::HAL::impl::SerializeTargetExecutablesPassBase<
+ SerializeTargetExecutablesPass> {
+ using IREE::HAL::impl::SerializeTargetExecutablesPassBase<
+ SerializeTargetExecutablesPass>::SerializeTargetExecutablesPassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (targetBackend) {
targetBackend->getDependentDialects(registry);
}
@@ -60,7 +51,7 @@
auto executableOp = getOperation();
auto moduleOp = executableOp->getParentOfType<mlir::ModuleOp>();
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (!targetBackend) {
executableOp.emitError()
<< "unregistered target backend '" << target << "'";
@@ -102,96 +93,35 @@
variantOp.erase();
}
}
-
-private:
- Option<std::string> target{
- *this, "target",
- llvm::cl::desc(
- "Target backend name whose executables will be serialized by "
- "this pass.")};
-
- Option<int> debugLevel{*this, "debug-level",
- llvm::cl::desc("Debug level for serialization (0-3)"),
- llvm::cl::init(2)};
- Option<std::string> dumpIntermediatesPath{
- *this, "dump-intermediates-path",
- llvm::cl::desc("Path to write translated executable intermediates (.bc, "
- ".o, etc) into for debugging.")};
- Option<std::string> dumpBinariesPath{
- *this, "dump-binaries-path",
- llvm::cl::desc("Path to write translated and serialized executable "
- "binaries into for debugging.")};
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createSerializeTargetExecutablesPass(
- const TargetBackendRegistry &targetRegistry, StringRef target,
- int debugLevel, std::string dumpIntermediatesPath,
- std::string dumpBinariesPath) {
- return std::make_unique<SerializeTargetExecutablesPass>(
- targetRegistry, target, debugLevel, dumpIntermediatesPath,
- dumpBinariesPath);
-}
+//===----------------------------------------------------------------------===//
+// --iree-hal-serialize-executables
+//===----------------------------------------------------------------------===//
-static PassRegistration<SerializeTargetExecutablesPass> linkTargetPass([] {
- return std::make_unique<SerializeTargetExecutablesPass>();
-});
-
-class SerializeExecutablesPass
- : public PassWrapper<SerializeExecutablesPass,
- OperationPass<IREE::HAL::ExecutableOp>> {
-public:
- SerializeExecutablesPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- SerializeExecutablesPass(const TargetBackendRegistry &targetRegistry,
- int debugLevel, std::string dumpIntermediatesPath,
- std::string dumpBinariesPath)
- : targetRegistry(targetRegistry), debugLevel(debugLevel),
- dumpIntermediatesPath(dumpIntermediatesPath),
- dumpBinariesPath(dumpBinariesPath) {}
-
- StringRef getArgument() const override {
- return "iree-hal-serialize-executables";
- }
-
- StringRef getDescription() const override {
- return "Serializes hal.executable.variant ops to hal.executable.binary ops";
- }
-
+struct SerializeExecutablesPass
+ : public IREE::HAL::impl::SerializeExecutablesPassBase<
+ SerializeExecutablesPass> {
+ using IREE::HAL::impl::SerializeExecutablesPassBase<
+ SerializeExecutablesPass>::SerializeExecutablesPassBase;
void runOnOperation() override {
auto executableOp = getOperation();
OpPassManager passManager(executableOp.getOperationName());
for (const auto &targetName : gatherExecutableTargetNames(executableOp)) {
- passManager.addPass(createSerializeTargetExecutablesPass(
- targetRegistry, targetName, debugLevel, dumpIntermediatesPath,
- dumpBinariesPath));
+ passManager.addPass(IREE::HAL::createSerializeTargetExecutablesPass(
+ {targetRegistry, targetName, debugLevel, dumpIntermediatesPath,
+ dumpBinariesPath}));
}
+
+ IREE_COMPILER_TRACE_MESSAGE_DYNAMIC(INFO, executableOp.getSymName().str());
+
if (failed(runPipeline(passManager, executableOp))) {
executableOp.emitError() << "failed to serialize executables";
return signalPassFailure();
}
}
-
-private:
- const TargetBackendRegistry &targetRegistry;
- int debugLevel;
- std::string dumpIntermediatesPath;
- std::string dumpBinariesPath;
};
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createSerializeExecutablesPass(const TargetBackendRegistry &targetRegistry,
- int debugLevel,
- std::string dumpIntermediatesPath,
- std::string dumpBinariesPath) {
- return std::make_unique<SerializeExecutablesPass>(
- targetRegistry, debugLevel, dumpIntermediatesPath, dumpBinariesPath);
-}
-
-static PassRegistration<SerializeExecutablesPass> linkPass([] {
- return std::make_unique<SerializeExecutablesPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/StripExecutableContents.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/StripExecutableContents.cpp
index a4d8600..bb52756 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/StripExecutableContents.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/StripExecutableContents.cpp
@@ -14,18 +14,18 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_STRIPEXECUTABLECONTENTSPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
+//===----------------------------------------------------------------------===//
+// --iree-hal-strip-executable-contents
+//===----------------------------------------------------------------------===//
+
struct StripExecutableContentsPass
- : public PassWrapper<StripExecutableContentsPass,
- OperationPass<mlir::ModuleOp>> {
- StringRef getArgument() const override {
- return "iree-hal-strip-executable-contents";
- }
-
- StringRef getDescription() const override {
- return "Strips executable module contents for reducing IR size during "
- "debugging.";
- }
-
+ : public IREE::HAL::impl::StripExecutableContentsPassBase<
+ StripExecutableContentsPass> {
void runOnOperation() override {
for (auto executableOp : getOperation().getOps<IREE::HAL::ExecutableOp>()) {
for (auto variantOp :
@@ -38,11 +38,6 @@
}
};
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createStripExecutableContentsPass() {
- return std::make_unique<StripExecutableContentsPass>();
-}
-
-static PassRegistration<StripExecutableContentsPass> pass;
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/SubstituteExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/SubstituteExecutables.cpp
index 2e695a6..1623a27 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/SubstituteExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/SubstituteExecutables.cpp
@@ -18,6 +18,11 @@
namespace mlir::iree_compiler::IREE::HAL {
+#define GEN_PASS_DEF_SUBSTITUTEEXECUTABLESPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
+
+namespace {
+
// Scans |searchPath| for all child files and appends them to |substitutions|.
// The file basename will be treated as an executable name and the path will be
// absolute such that no object path resolution occurs later on.
@@ -200,31 +205,15 @@
}
}
-class SubstituteExecutablesPass
- : public PassWrapper<SubstituteExecutablesPass, OperationPass<ModuleOp>> {
-public:
- SubstituteExecutablesPass() = default;
- SubstituteExecutablesPass(const SubstituteExecutablesPass &pass) {}
- SubstituteExecutablesPass(ArrayRef<std::string> substitutions) {
- this->substitutions = substitutions;
- }
- SubstituteExecutablesPass(std::string searchPath) {
- this->searchPath = std::move(searchPath);
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-substitute-executables
+//===----------------------------------------------------------------------===//
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<IREE::HAL::HALDialect>();
- }
-
- StringRef getArgument() const override {
- return "iree-hal-substitute-executables";
- }
-
- StringRef getDescription() const override {
- return "Substitutes hal.executable ops by parsing |substitutions| in "
- "`executable_name=file.xxx` strings.";
- }
-
+struct SubstituteExecutablesPass
+ : public IREE::HAL::impl::SubstituteExecutablesPassBase<
+ SubstituteExecutablesPass> {
+ using IREE::HAL::impl::SubstituteExecutablesPassBase<
+ SubstituteExecutablesPass>::SubstituteExecutablesPassBase;
void runOnOperation() override {
auto moduleOp = getOperation();
auto moduleName = moduleOp.getName().value_or("module");
@@ -282,29 +271,8 @@
}
}
}
-
-private:
- ListOption<std::string> substitutions{
- *this, "substitutions",
- llvm::cl::desc(
- "Substitution `executable_name=file.xxx` key-value pairs.")};
- Option<std::string> searchPath{
- *this, "search-path",
- llvm::cl::desc("Path to source executable substitutions from.")};
};
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createSubstituteExecutablesPass(ArrayRef<std::string> substitutions) {
- return std::make_unique<SubstituteExecutablesPass>(substitutions);
-}
-
-std::unique_ptr<OperationPass<mlir::ModuleOp>>
-createSubstituteExecutablesPass(std::string searchPath) {
- return std::make_unique<SubstituteExecutablesPass>(std::move(searchPath));
-}
-
-static PassRegistration<SubstituteExecutablesPass> pass([] {
- return std::make_unique<SubstituteExecutablesPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp
index 060468d..a215884 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/TranslateExecutables.cpp
@@ -11,6 +11,7 @@
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Target/TargetBackend.h"
#include "iree/compiler/Dialect/HAL/Target/TargetRegistry.h"
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
#include "iree/compiler/Utils/TracingUtils.h"
#include "llvm/ADT/StringSet.h"
#include "mlir/Dialect/Bufferization/IR/Bufferization.h"
@@ -22,33 +23,27 @@
namespace mlir::iree_compiler::IREE::HAL {
-class TranslateTargetExecutableVariantsPass
- : public PassWrapper<TranslateTargetExecutableVariantsPass,
- OperationPass<IREE::HAL::ExecutableVariantOp>> {
-public:
- TranslateTargetExecutableVariantsPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- TranslateTargetExecutableVariantsPass(
- const TranslateTargetExecutableVariantsPass &pass)
- : targetRegistry(pass.targetRegistry) {}
- TranslateTargetExecutableVariantsPass(
- const TargetBackendRegistry &targetRegistry, StringRef target)
- : targetRegistry(targetRegistry) {
- this->target = target.str();
- }
+#define GEN_PASS_DEF_TRANSLATEEXECUTABLESPASS
+#define GEN_PASS_DEF_TRANSLATETARGETEXECUTABLEVARIANTSPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
- StringRef getArgument() const override {
- return "iree-hal-translate-target-executable-variants";
- }
+namespace {
- StringRef getDescription() const override {
- return "Serializes hal.executable.variant ops to hal.executable.binary ops";
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-translate-target-executable-variants
+//===----------------------------------------------------------------------===//
+
+struct TranslateTargetExecutableVariantsPass
+ : public IREE::HAL::impl::TranslateTargetExecutableVariantsPassBase<
+ TranslateTargetExecutableVariantsPass> {
+ using IREE::HAL::impl::TranslateTargetExecutableVariantsPassBase<
+ TranslateTargetExecutableVariantsPass>::
+ TranslateTargetExecutableVariantsPassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
registry.insert<bufferization::BufferizationDialect>();
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (targetBackend) {
targetBackend->getDependentDialects(registry);
}
@@ -59,7 +54,7 @@
if (variantOp.getTarget().getBackend().getValue() != target)
return;
- auto targetBackend = targetRegistry.getTargetBackend(target);
+ auto targetBackend = targetRegistry->getTargetBackend(target);
if (!targetBackend) {
variantOp.emitError() << "unregistered target backend '" << target << "'";
return signalPassFailure();
@@ -74,51 +69,23 @@
return signalPassFailure();
}
}
-
-private:
- Option<std::string> target{
- *this, "target",
- llvm::cl::desc(
- "Target backend name whose executables will be translated by "
- "this pass.")};
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableVariantOp>>
-createTranslateTargetExecutableVariantsPass(
- const TargetBackendRegistry &targetRegistry, StringRef target) {
- return std::make_unique<TranslateTargetExecutableVariantsPass>(targetRegistry,
- target);
-}
+//===----------------------------------------------------------------------===//
+// --iree-hal-translate-executables
+//===----------------------------------------------------------------------===//
-static PassRegistration<TranslateTargetExecutableVariantsPass> linkTargetPass(
- [] { return std::make_unique<TranslateTargetExecutableVariantsPass>(); });
-
-class TranslateExecutablesPass
- : public PassWrapper<TranslateExecutablesPass,
- OperationPass<IREE::HAL::ExecutableOp>> {
-public:
- TranslateExecutablesPass()
- : targetRegistry(TargetBackendRegistry::getGlobal()) {}
- TranslateExecutablesPass(const TranslateExecutablesPass &pass)
- : targetRegistry(pass.targetRegistry) {}
- TranslateExecutablesPass(const TargetBackendRegistry &targetRegistry)
- : targetRegistry(targetRegistry) {}
-
- StringRef getArgument() const override {
- return "iree-hal-translate-executables";
- }
-
- StringRef getDescription() const override {
- return "Serializes hal.executable.variant ops to hal.executable.binary ops";
- }
+struct TranslateExecutablesPass
+ : public IREE::HAL::impl::TranslateExecutablesPassBase<
+ TranslateExecutablesPass> {
+ using IREE::HAL::impl::TranslateExecutablesPassBase<
+ TranslateExecutablesPass>::TranslateExecutablesPassBase;
void getDependentDialects(DialectRegistry ®istry) const override {
registry.insert<IREE::HAL::HALDialect>();
registry.insert<bufferization::BufferizationDialect>();
- auto targetBackends = targetRegistry.getTargetBackends(
- targetRegistry.getRegisteredTargetBackends());
+ auto targetBackends = targetRegistry->getTargetBackends(
+ targetRegistry->getRegisteredTargetBackends());
for (auto &targetBackend : targetBackends) {
targetBackend->getDependentDialects(registry);
}
@@ -129,28 +96,19 @@
OpPassManager passManager(executableOp.getOperationName());
for (const auto &targetName : gatherExecutableTargetNames(executableOp)) {
passManager.addNestedPass<IREE::HAL::ExecutableVariantOp>(
- createTranslateTargetExecutableVariantsPass(targetRegistry,
- targetName));
+ IREE::HAL::createTranslateTargetExecutableVariantsPass(
+ {targetRegistry, targetName}));
}
IREE_COMPILER_TRACE_MESSAGE_DYNAMIC(INFO, executableOp.getSymName().str());
if (failed(runPipeline(passManager, executableOp))) {
- executableOp.emitError() << "failed to serialize executables";
+ executableOp.emitError() << "failed to translate executables";
return signalPassFailure();
}
}
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<IREE::HAL::ExecutableOp>>
-createTranslateExecutablesPass(const TargetBackendRegistry &targetRegistry) {
- return std::make_unique<TranslateExecutablesPass>(targetRegistry);
-}
-
-static PassRegistration<TranslateExecutablesPass> translatePass([] {
- return std::make_unique<TranslateExecutablesPass>();
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/VerifyTargetEnvironment.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/VerifyTargetEnvironment.cpp
index 39f378b..64a003d 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/VerifyTargetEnvironment.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/VerifyTargetEnvironment.cpp
@@ -12,7 +12,6 @@
#include "iree/compiler/Dialect/HAL/Target/TargetBackend.h"
#include "iree/compiler/Dialect/HAL/Target/TargetRegistry.h"
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h"
-#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/IR/Attributes.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/BuiltinTypes.h"
@@ -21,24 +20,20 @@
namespace mlir::iree_compiler::IREE::HAL {
-class VerifyTargetEnvironmentPass
- : public PassWrapper<VerifyTargetEnvironmentPass, OperationPass<ModuleOp>> {
-public:
- VerifyTargetEnvironmentPass(const TargetBackendRegistry &targetRegistry)
- : targetRegistry(targetRegistry) {}
+#define GEN_PASS_DEF_VERIFYTARGETENVIRONMENTPASS
+#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc"
- void getDependentDialects(DialectRegistry ®istry) const override {
- registry.insert<IREE::HAL::HALDialect>();
- }
+namespace {
- StringRef getArgument() const override {
- return "iree-hal-verify-target-environment";
- }
+//===----------------------------------------------------------------------===//
+// --iree-hal-verify-target-environment
+//===----------------------------------------------------------------------===//
- StringRef getDescription() const override {
- return "Verifies that the target execution environment is valid.";
- }
-
+struct VerifyTargetEnvironmentPass
+ : public IREE::HAL::impl::VerifyTargetEnvironmentPassBase<
+ VerifyTargetEnvironmentPass> {
+ using IREE::HAL::impl::VerifyTargetEnvironmentPassBase<
+ VerifyTargetEnvironmentPass>::VerifyTargetEnvironmentPassBase;
void runOnOperation() override {
auto moduleOp = getOperation();
@@ -64,7 +59,7 @@
diagnostic
<< "no HAL target devices specified on the module (available = [ ";
for (const auto &targetName :
- targetRegistry.getRegisteredTargetBackends()) {
+ targetRegistry->getRegisteredTargetBackends()) {
diagnostic << "'" << targetName << "' ";
}
diagnostic << "])";
@@ -82,14 +77,14 @@
}
auto targetBackend =
- targetRegistry.getTargetBackend(targetAttr.getDeviceID().getValue());
+ targetRegistry->getTargetBackend(targetAttr.getDeviceID().getValue());
if (!targetBackend) {
auto diagnostic = moduleOp.emitError();
diagnostic
<< "unregistered target backend " << targetAttr.getDeviceID()
<< "; ensure it is linked in to the compiler (available = [ ";
for (const auto &targetName :
- targetRegistry.getRegisteredTargetBackends()) {
+ targetRegistry->getRegisteredTargetBackends()) {
diagnostic << "'" << targetName << "' ";
}
diagnostic << "])";
@@ -98,18 +93,8 @@
}
}
}
-
- const TargetBackendRegistry &targetRegistry;
};
-std::unique_ptr<OperationPass<ModuleOp>>
-createVerifyTargetEnvironmentPass(const TargetBackendRegistry &targetRegistry) {
- return std::make_unique<VerifyTargetEnvironmentPass>(targetRegistry);
-}
-
-static PassRegistration<VerifyTargetEnvironmentPass> pass([] {
- return std::make_unique<VerifyTargetEnvironmentPass>(
- TargetBackendRegistry::getGlobal());
-});
+} // namespace
} // namespace mlir::iree_compiler::IREE::HAL
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/BUILD.bazel b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/BUILD.bazel
index 778254c..3c930d0 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/BUILD.bazel
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/BUILD.bazel
@@ -17,7 +17,6 @@
srcs = enforce_glob(
[
"assign_target_devices.mlir",
- "benchmark_batch_dispatches.mlir",
"convert_to_hal.mlir",
"dump_executable_benchmarks.mlir",
"dump_executable_sources.mlir",
@@ -28,6 +27,7 @@
"materialize_resource_caches.mlir",
"memoize_device_queries.mlir",
"preprocess_executables.mlir",
+ "repeat_dispatches.mlir",
"resolve_export_ordinals.mlir",
"strip_executable_contents.mlir",
"substitute_executables.mlir",
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/CMakeLists.txt b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/CMakeLists.txt
index 2f5b0e9..b4be816 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/CMakeLists.txt
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/CMakeLists.txt
@@ -15,7 +15,6 @@
lit
SRCS
"assign_target_devices.mlir"
- "benchmark_batch_dispatches.mlir"
"convert_to_hal.mlir"
"dump_executable_benchmarks.mlir"
"dump_executable_sources.mlir"
@@ -26,6 +25,7 @@
"materialize_resource_caches.mlir"
"memoize_device_queries.mlir"
"preprocess_executables.mlir"
+ "repeat_dispatches.mlir"
"resolve_export_ordinals.mlir"
"strip_executable_contents.mlir"
"substitute_executables.mlir"
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/materialize_dispatch_instrumentation.mlir b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/materialize_dispatch_instrumentation.mlir
index 3ea7bf2..fcb1a75 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/materialize_dispatch_instrumentation.mlir
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/materialize_dispatch_instrumentation.mlir
@@ -1,4 +1,4 @@
-// RUN: iree-opt --split-input-file --pass-pipeline='builtin.module(iree-hal-materialize-dispatch-instrumentation{bufferSize=64mib})' %s | FileCheck %s
+// RUN: iree-opt --split-input-file --pass-pipeline='builtin.module(iree-hal-materialize-dispatch-instrumentation{buffer-size=64mib})' %s | FileCheck %s
module attributes {hal.device.targets = [
#hal.device.target<"llvm-cpu", {
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/preprocess_executables.mlir b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/preprocess_executables.mlir
index 670a326..6742b24 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/preprocess_executables.mlir
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/preprocess_executables.mlir
@@ -1,9 +1,9 @@
// RUN: iree-opt --split-input-file %s \
-// RUN: --pass-pipeline="builtin.module(hal.executable(iree-hal-preprocess-executables{pipeline=\"builtin.module(iree-codegen-test-executable-preprocessing)\"}))" | \
+// RUN: --pass-pipeline="builtin.module(hal.executable(iree-hal-preprocess-executables-with-pipeline{pipeline=\"builtin.module(iree-codegen-test-executable-preprocessing)\"}))" | \
// RUN: FileCheck %s
// RUN: iree-opt --split-input-file %s \
-// RUN: --pass-pipeline="builtin.module(hal.executable(iree-hal-preprocess-executables{command=\"iree-opt --iree-codegen-test-executable-preprocessing\"}))" | \
+// RUN: --pass-pipeline="builtin.module(hal.executable(iree-hal-preprocess-executables-with-tool{command=\"iree-opt --iree-codegen-test-executable-preprocessing\"}))" | \
// RUN: FileCheck %s
// Uses a test pass to simulate an external user pipeline or tool that
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/benchmark_batch_dispatches.mlir b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/repeat_dispatches.mlir
similarity index 96%
rename from compiler/src/iree/compiler/Dialect/HAL/Transforms/test/benchmark_batch_dispatches.mlir
rename to compiler/src/iree/compiler/Dialect/HAL/Transforms/test/repeat_dispatches.mlir
index 54fe8b1..7e60dbc 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/benchmark_batch_dispatches.mlir
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/test/repeat_dispatches.mlir
@@ -1,4 +1,4 @@
-// RUN: iree-opt --split-input-file -test-iree-hal-benchmark-batch-dispatches-2-times %s | FileCheck %s
+// RUN: iree-opt --split-input-file --pass-pipeline='builtin.module(func.func(iree-hal-repeat-dispatches{count=2}))' %s | FileCheck %s
util.global @_executable : !hal.executable
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/BUILD.bazel b/compiler/src/iree/compiler/Dialect/Stream/Transforms/BUILD.bazel
index 1c96994..278e82e 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/BUILD.bazel
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/BUILD.bazel
@@ -30,6 +30,7 @@
"PackConstants.cpp",
"PackDispatchOperands.cpp",
"Passes.cpp",
+ "Passes.h.inc",
"PropagateTimepoints.cpp",
"RefineUsage.cpp",
"ScheduleAllocation.cpp",
@@ -41,12 +42,10 @@
],
hdrs = [
"Passes.h",
- "Passes.h.inc",
],
deps = [
":PassesIncGen",
"//compiler/src/iree/compiler/Dialect/Flow/IR",
- "//compiler/src/iree/compiler/Dialect/Flow/Transforms",
"//compiler/src/iree/compiler/Dialect/HAL/IR",
"//compiler/src/iree/compiler/Dialect/Stream/Analysis",
"//compiler/src/iree/compiler/Dialect/Stream/Builtins",
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/CMakeLists.txt b/compiler/src/iree/compiler/Dialect/Stream/Transforms/CMakeLists.txt
index c6c2d51..34ea128 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/CMakeLists.txt
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/CMakeLists.txt
@@ -15,7 +15,6 @@
Transforms
HDRS
"Passes.h"
- "Passes.h.inc"
SRCS
"AnnotateDispatchArguments.cpp"
"ConvertToStream.cpp"
@@ -32,6 +31,7 @@
"PackConstants.cpp"
"PackDispatchOperands.cpp"
"Passes.cpp"
+ "Passes.h.inc"
"PropagateTimepoints.cpp"
"RefineUsage.cpp"
"ScheduleAllocation.cpp"
@@ -62,7 +62,6 @@
MLIRTransforms
MLIRVectorDialect
iree::compiler::Dialect::Flow::IR
- iree::compiler::Dialect::Flow::Transforms
iree::compiler::Dialect::HAL::IR
iree::compiler::Dialect::Stream::Analysis
iree::compiler::Dialect::Stream::Builtins
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/Passes.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/Passes.cpp
index a9a4856..aa1a2d6 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/Passes.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/Passes.cpp
@@ -8,7 +8,6 @@
#include <memory>
-#include "iree/compiler/Dialect/Flow/Transforms/Passes.h"
#include "iree/compiler/Dialect/Util/Transforms/Passes.h"
#include "iree/compiler/Utils/PassUtils.h"
#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
@@ -47,7 +46,7 @@
}
//===----------------------------------------------------------------------===//
-// -iree-stream-tensor-transformation-pipeline
+// --iree-stream-tensor-transformation-pipeline
//===----------------------------------------------------------------------===//
void buildStreamTensorPassPipeline(OpPassManager &passManager,
@@ -106,7 +105,7 @@
}
//===----------------------------------------------------------------------===//
-// -iree-stream-async-transformation-pipeline
+// --iree-stream-async-transformation-pipeline
//===----------------------------------------------------------------------===//
void buildStreamAsyncPassPipeline(OpPassManager &passManager,
@@ -181,7 +180,7 @@
}
//===----------------------------------------------------------------------===//
-// -iree-stream-cmd-transformation-pipeline
+// --iree-stream-cmd-transformation-pipeline
//===----------------------------------------------------------------------===//
void buildStreamCmdPassPipeline(OpPassManager &passManager,
@@ -220,7 +219,7 @@
}
//===----------------------------------------------------------------------===//
-// -iree-stream-optimization-pipeline
+// --iree-stream-optimization-pipeline
//===----------------------------------------------------------------------===//
void buildStreamOptimizationPassPipeline(
@@ -304,7 +303,7 @@
}
//===----------------------------------------------------------------------===//
-// -iree-stream-transformation-pipeline
+// --iree-stream-transformation-pipeline
//===----------------------------------------------------------------------===//
void buildStreamTransformPassPipeline(
@@ -350,7 +349,16 @@
// Registration
//===----------------------------------------------------------------------===//
-void registerStreamTransformPassPipelines() {
+namespace {
+#define GEN_PASS_REGISTRATION
+#include "iree/compiler/Dialect/Stream/Transforms/Passes.h.inc" // IWYU pragma: export
+} // namespace
+
+void registerStreamPasses() {
+ // Generated.
+ registerPasses();
+
+ // Pipelines.
PassPipelineRegistration<TransformOptions> tensorPassPipeline(
"iree-stream-tensor-transformation-pipeline",
"Lowers source dialects into stream.tensor.* IR.",
@@ -384,17 +392,4 @@
});
}
-namespace {
-#define GEN_PASS_REGISTRATION
-#include "iree/compiler/Dialect/Stream/Transforms/Passes.h.inc" // IWYU pragma: export
-} // namespace
-
-void registerStreamPasses() {
- // Generated.
- registerPasses();
-
- // Pipelines.
- registerStreamTransformPassPipelines();
-}
-
} // namespace mlir::iree_compiler::IREE::Stream
diff --git a/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/multiple_target_env_conversion.mlir b/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/multiple_target_env_conversion.mlir
index 7c6cb29..e2e3e87 100644
--- a/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/multiple_target_env_conversion.mlir
+++ b/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/multiple_target_env_conversion.mlir
@@ -1,5 +1,4 @@
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' \
-// RUN: --iree-hal-target-backends=vulkan-spirv \
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' \
// RUN: --iree-vulkan-target-triple=rdna3-7900xtx-windows \
// RUN: --iree-vulkan-target-env="#vk.target_env<v1.1, r(120), [VK_KHR_spirv_1_4, VK_KHR_storage_buffer_storage_class], AMD:DiscreteGPU, #vk.caps<maxComputeSharedMemorySize = 16384, maxComputeWorkGroupInvocations = 1024, maxComputeWorkGroupSize = dense<[128, 8, 4]>: vector<3xi32>, subgroupFeatures = 63 : i32, subgroupSize = 4 >>" \
// RUN: --iree-vulkan-target-triple=valhall-unknown-android31 \
diff --git a/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/target_env_conversion.mlir b/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/target_env_conversion.mlir
index ae43012..62d531b 100644
--- a/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/target_env_conversion.mlir
+++ b/compiler/src/iree/compiler/Dialect/Vulkan/Utils/test/target_env_conversion.mlir
@@ -1,12 +1,12 @@
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv %s | FileCheck %s --check-prefix=DEFAULT
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=adreno-a650-android30 %s | FileCheck %s --check-prefix=ADRENO
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=valhall-unknown-android31 %s | FileCheck %s --check-prefix=VALHALL
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=turing-t4-linux %s | FileCheck %s --check-prefix=TURING
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=rdna1-5700xt-windows %s | FileCheck %s --check-prefix=RDNA1
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=rdna3-6900xtx-windows %s | FileCheck %s --check-prefix=RDNA3
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=m1-moltenvk-macos %s | FileCheck %s --check-prefix=M1
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=arc-770-windows %s | FileCheck %s --check-prefix=ARC
-// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-transformation-pipeline{serialize-executables=false})' --iree-hal-target-backends=vulkan-spirv --iree-vulkan-target-triple=pascal-1080-windows %s | FileCheck %s --check-prefix=PASCAL
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' %s | FileCheck %s --check-prefix=DEFAULT
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=adreno-a650-android30 %s | FileCheck %s --check-prefix=ADRENO
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=valhall-unknown-android31 %s | FileCheck %s --check-prefix=VALHALL
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=turing-t4-linux %s | FileCheck %s --check-prefix=TURING
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=rdna1-5700xt-windows %s | FileCheck %s --check-prefix=RDNA1
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=rdna3-6900xtx-windows %s | FileCheck %s --check-prefix=RDNA3
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=m1-moltenvk-macos %s | FileCheck %s --check-prefix=M1
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=arc-770-windows %s | FileCheck %s --check-prefix=ARC
+// RUN: iree-opt --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=vulkan-spirv},iree-hal-transformation-pipeline{serialize-executables=false})' --iree-vulkan-target-triple=pascal-1080-windows %s | FileCheck %s --check-prefix=PASCAL
// TODO(antiagainst): Passing in lenghty strings as command-line options is not
// optimal. We should consider creating a dedicated test pass to pick up
diff --git a/compiler/src/iree/compiler/Modules/HAL/Inline/Transforms/Passes.cpp b/compiler/src/iree/compiler/Modules/HAL/Inline/Transforms/Passes.cpp
index 0ad371a..7c02c39 100644
--- a/compiler/src/iree/compiler/Modules/HAL/Inline/Transforms/Passes.cpp
+++ b/compiler/src/iree/compiler/Modules/HAL/Inline/Transforms/Passes.cpp
@@ -61,9 +61,9 @@
// Translate each executable down to common MLIR dialects.
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- IREE::HAL::createConfigureExecutablesPass(targetRegistry));
+ IREE::HAL::createConfigureExecutablesPass({targetRegistry}));
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- IREE::HAL::createTranslateExecutablesPass(targetRegistry));
+ IREE::HAL::createTranslateExecutablesPass({targetRegistry}));
// Inline the translated executable functions.
// We preserve the executables for their metadata used during conversion.
diff --git a/compiler/src/iree/compiler/Modules/HAL/Loader/Transforms/Passes.cpp b/compiler/src/iree/compiler/Modules/HAL/Loader/Transforms/Passes.cpp
index b675e1d..9b58d42 100644
--- a/compiler/src/iree/compiler/Modules/HAL/Loader/Transforms/Passes.cpp
+++ b/compiler/src/iree/compiler/Modules/HAL/Loader/Transforms/Passes.cpp
@@ -66,9 +66,9 @@
// After this point the executables are opaque blobs and we cannot change
// their interfaces.
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- IREE::HAL::createConfigureExecutablesPass(targetRegistry));
+ IREE::HAL::createConfigureExecutablesPass({targetRegistry}));
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
- IREE::HAL::createTranslateExecutablesPass(targetRegistry));
+ IREE::HAL::createTranslateExecutablesPass({targetRegistry}));
//----------------------------------------------------------------------------
// Conversion
@@ -82,7 +82,7 @@
//----------------------------------------------------------------------------
// Link executables together.
- passManager.addPass(IREE::HAL::createLinkExecutablesPass(targetRegistry));
+ passManager.addPass(IREE::HAL::createLinkExecutablesPass({targetRegistry}));
// Resolve export ordinals from nested symbol references prior to
// serialization.
@@ -91,9 +91,9 @@
// Serialize executables to their binary forms.
passManager.addNestedPass<IREE::HAL::ExecutableOp>(
IREE::HAL::createSerializeExecutablesPass(
- targetRegistry, targetOptions.debugLevel,
- targetOptions.executableIntermediatesPath,
- targetOptions.executableBinariesPath));
+ {&targetRegistry, targetOptions.debugLevel,
+ targetOptions.executableIntermediatesPath,
+ targetOptions.executableBinariesPath}));
// NOTE: symbol DCE will destroy executable target contents.
passManager.addPass(mlir::createSymbolDCEPass());
diff --git a/compiler/src/iree/compiler/Pipelines/Pipelines.cpp b/compiler/src/iree/compiler/Pipelines/Pipelines.cpp
index 40a5499..f8ebd27 100644
--- a/compiler/src/iree/compiler/Pipelines/Pipelines.cpp
+++ b/compiler/src/iree/compiler/Pipelines/Pipelines.cpp
@@ -37,7 +37,7 @@
// specifying targets.
if (!executableOptions.targets.empty()) {
passManager.addPass(IREE::HAL::createAssignTargetDevicesPass(
- targetRegistry, executableOptions.targets));
+ {&targetRegistry, executableOptions.targets}));
}
// Input pipelines can result in changes to the exported functions and types
diff --git a/compiler/src/iree/compiler/Utils/OptionUtils.cpp b/compiler/src/iree/compiler/Utils/OptionUtils.cpp
index 015bf26..e8d9491 100644
--- a/compiler/src/iree/compiler/Utils/OptionUtils.cpp
+++ b/compiler/src/iree/compiler/Utils/OptionUtils.cpp
@@ -122,12 +122,10 @@
return size * scale;
}
-namespace llvm {
-namespace cl {
+namespace llvm::cl {
template class basic_parser<ByteSize>;
template class basic_parser<PowerOf2ByteSize>;
-} // namespace cl
-} // namespace llvm
+} // namespace llvm::cl
using ByteSize = llvm::cl::ByteSize;
using PowerOf2ByteSize = llvm::cl::PowerOf2ByteSize;
diff --git a/compiler/src/iree/compiler/Utils/OptionUtils.h b/compiler/src/iree/compiler/Utils/OptionUtils.h
index f04f8c4..c2b5812 100644
--- a/compiler/src/iree/compiler/Utils/OptionUtils.h
+++ b/compiler/src/iree/compiler/Utils/OptionUtils.h
@@ -236,8 +236,7 @@
} // namespace mlir::iree_compiler
-namespace llvm {
-namespace cl {
+namespace llvm::cl {
struct ByteSize {
int64_t value = 0;
@@ -276,7 +275,6 @@
void anchor() override;
};
-} // namespace cl
-} // namespace llvm
+} // namespace llvm::cl
#endif // IREE_COMPILER_UTILS_FLAG_UTILS_H
diff --git a/tests/e2e/regression/libm_linking.mlir b/tests/e2e/regression/libm_linking.mlir
index d0b4afe..543ac86 100644
--- a/tests/e2e/regression/libm_linking.mlir
+++ b/tests/e2e/regression/libm_linking.mlir
@@ -1,5 +1,5 @@
-// RUN: iree-opt --split-input-file --iree-transformation-pipeline --iree-hal-target-backends=llvm-cpu %s | FileCheck %s
-// RUN: iree-opt --split-input-file --iree-transformation-pipeline --iree-hal-target-backends=llvm-cpu --iree-llvmcpu-link-embedded=false %s | FileCheck %s
+// RUN: iree-opt --split-input-file --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=llvm-cpu},iree-transformation-pipeline)' %s | FileCheck %s
+// RUN: iree-opt --split-input-file --pass-pipeline='builtin.module(iree-hal-assign-target-devices{targets=llvm-cpu},iree-transformation-pipeline)' --iree-llvmcpu-link-embedded=false %s | FileCheck %s
// When lowering to CPU code through LLVM, certain LLVM intrinsics require
// linking against libm (the standard C library of math functions, `-lm`).
diff --git a/tools/test/executable_configurations.mlir b/tools/test/executable_configurations.mlir
index 67ca926..98554fc 100644
--- a/tools/test/executable_configurations.mlir
+++ b/tools/test/executable_configurations.mlir
@@ -33,12 +33,12 @@
// for individual executables one or more `executable_name=file.mlir` pairs can
// be repeated in `--iree-hal-substitute-executable-configuration=`.
-func.func @abs(%input : tensor<f32>) -> (tensor<f32>) {
+func.func @abs(%input : tensor<f32>) -> tensor<f32> {
%result = math.absf %input : tensor<f32>
return %result : tensor<f32>
}
-// CHECK: IR Dump Before mlir::iree_compiler::IREE::HAL::SerializeExecutablesPass
+// CHECK: IR Dump Before SerializeExecutablesPass
// CHECK: hal.executable public @abs_dispatch_0
// CHECK: hal.executable.variant public @vmvx_bytecode_fb
// CHECK: vm.func private @abs_dispatch_0_generic
diff --git a/tools/test/executable_sources.mlir b/tools/test/executable_sources.mlir
index 92df2e9..30e305e 100644
--- a/tools/test/executable_sources.mlir
+++ b/tools/test/executable_sources.mlir
@@ -36,7 +36,7 @@
return %result : tensor<f32>
}
-// CHECK: IR Dump Before mlir::iree_compiler::IREE::HAL::SerializeExecutablesPass
+// CHECK: IR Dump Before SerializeExecutablesPass
// CHECK: hal.executable public @abs_dispatch_0
// CHECK: hal.executable.variant public @vmvx_bytecode_fb
// CHECK: vm.func private @abs_dispatch_0_generic