blob: e3231c3fd05a03ebd99d78de4a42497d5f635240 [file]
// Copyright 2019 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_COMPILER_DIALECT_HAL_TRANSFORMS_PASSES_H_
#define IREE_COMPILER_DIALECT_HAL_TRANSFORMS_PASSES_H_
#include "iree/compiler/Dialect/HAL/IR/HALOps.h"
#include "iree/compiler/Dialect/HAL/Target/TargetBackend.h"
#include "iree/compiler/Dialect/HAL/Target/TargetDevice.h"
#include "iree/compiler/Dialect/HAL/Target/TargetOptions.h"
#include "iree/compiler/Dialect/HAL/Target/TargetRegistry.h"
#include "llvm/ADT/StringMap.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Support/LLVM.h"
namespace mlir::iree_compiler::IREE::HAL {
//===----------------------------------------------------------------------===//
// Pipelines
//===----------------------------------------------------------------------===//
enum class PipelinePhase {
// Pipeline entry point.
Start,
// Runs the transform pipeline up to executable sources (pre translation).
ExecutableSources,
// Runs the transform pipeline up to executable configurations (before
// translation strategy selection).
ExecutableConfigurations,
// Runs the transform pipeline until just after executable translation.
ExecutableTargets,
// Runs the full pipeline.
End,
};
// Hooks for injecting behavior into the HAL pipeline.
struct PipelineHooks {
// Called immediately before a compilation phase.
std::function<void(PipelinePhase phase, OpPassManager &)> beforePhase;
// Called immediately after a compilation phase.
std::function<void(PipelinePhase phase, OpPassManager &)> afterPhase;
};
struct AssignmentOptions : public PassPipelineOptions<AssignmentOptions> {
// TODO(benvanik): remove the legacy flag once users are switched to devices.
ListOption<std::string> legacyTargetBackends{
*this,
"legacy-target-backends",
llvm::cl::desc("DEPRECATED: Target backend names."),
llvm::cl::ZeroOrMore,
};
ListOption<std::string> targetDevices{
*this,
"target-devices",
llvm::cl::desc("Target device specifications."),
llvm::cl::ZeroOrMore,
};
Option<std::string> defaultDevice{
*this,
"default-device",
llvm::cl::desc("Which device is considered the default when no device "
"affinity is specified. Either the device name when names "
"are specified or the numeric ordinal of the device."),
llvm::cl::init(""),
};
};
// Assigns devices from flags and coarse module-level specification.
// Frontends are encouraged to create and assign devices themselves in order to
// support more complex configurations (multiple devices, fallbacks, etc).
void buildHALDeviceAssignmentPassPipeline(
OpPassManager &passManager, const TargetRegistry &targetRegistry,
const AssignmentOptions &assignmentOptions);
// Adds a set of passes to the given pass manager that run the head of the HAL
// pipeline to materialize interfaces, import externally specified executables,
// and translate executables. The host portion of the program is annotated but
// not modified.
void buildHALConfigurationPassPipeline(OpPassManager &passManager,
const TargetRegistry &targetRegistry,
const TargetOptions &targetOptions,
PipelineHooks hooks = {});
// Adds a set of passes to the given pass manager that run the required HAL
// transforms in the canonical order.
//
// Most translation code should prefer to use this instead of manually adding
// the passes themselves to ensure that expected pass ordering is observed.
//
// The expected usage is:
// <run conversion to flow/sequencer/etc>
// buildHALTransformPassPipeline & run
// <run conversion from HAL to vm/etc>
void buildHALTransformPassPipeline(
OpPassManager &passManager, const TargetRegistry &targetRegistry,
const TargetOptions &targetOptions, PipelineHooks hooks = {},
PipelinePhase compileFrom = PipelinePhase::Start,
PipelinePhase compileTo = PipelinePhase::End);
//===----------------------------------------------------------------------===//
// Passes
//===----------------------------------------------------------------------===//
// Preprocesses each executable with an MLIR pass pipeline or external command
// line tool.
std::unique_ptr<Pass> createPreprocessExecutablesPass(std::string command = "");
//===----------------------------------------------------------------------===//
// Register all Passes
//===----------------------------------------------------------------------===//
#define GEN_PASS_DECL
#include "iree/compiler/Dialect/HAL/Transforms/Passes.h.inc" // IWYU pragma: keep
void registerHALPasses();
} // namespace mlir::iree_compiler::IREE::HAL
#endif // IREE_COMPILER_DIALECT_HAL_TRANSFORMS_PASSES_H_