blob: c17f9bd893f07302f896d4d878200b3fee39d23d [file] [edit]
// Copyright 2022 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_PIPELINES_PIPELINES_H_
#define IREE_COMPILER_PIPELINES_PIPELINES_H_
#include "iree/compiler/Dialect/HAL/Target/TargetOptions.h"
#include "iree/compiler/Dialect/HAL/Target/TargetRegistry.h"
#include "iree/compiler/Dialect/VM/Conversion/TargetOptions.h"
#include "iree/compiler/Dialect/VM/Target/Bytecode/BytecodeModuleTarget.h"
#include "iree/compiler/Pipelines/Options.h"
#include "mlir/Pass/PassManager.h"
namespace mlir::iree_compiler {
class PipelineExtensions;
namespace IREE::HAL {
struct PipelineHooks;
} // namespace IREE::HAL
enum class IREEVMPipelinePhase {
Start,
Input,
ABI,
Preprocessing,
GlobalOptimization,
DispatchCreation,
Flow,
Stream,
ExecutableSources,
ExecutableConfigurations,
ExecutableTargets,
HAL,
VM,
End,
};
// Enumerates names and descriptions for pipeline phase values.
inline static void enumerateIREEVMPipelinePhases(
std::function<void(IREEVMPipelinePhase, StringRef name, StringRef desc)>
callback) {
callback(IREEVMPipelinePhase::Start, "start",
"Entry point to the compilation pipeline.");
callback(IREEVMPipelinePhase::Input, "input",
"Performs input processing and lowering into core IREE "
"input dialects (linalg/etc).");
callback(IREEVMPipelinePhase::ABI, "abi",
"Adjusts program ABI for the specified execution environment.");
callback(IREEVMPipelinePhase::Preprocessing, "preprocessing",
"Compiles up to the `preprocessing` specified");
callback(IREEVMPipelinePhase::GlobalOptimization, "global-optimization",
"Compiles up to global optimization.");
callback(IREEVMPipelinePhase::DispatchCreation, "dispatch-creation",
"Compiles up to dispatch creation.");
callback(IREEVMPipelinePhase::Flow, "flow",
"Compiles up to the `flow` dialect.");
callback(IREEVMPipelinePhase::Stream, "stream",
"Compiles up to the `stream` dialect.");
callback(IREEVMPipelinePhase::ExecutableSources, "executable-sources",
"Compiles up to just before `hal.executable`s are configured, "
"excluding codegen.");
callback(IREEVMPipelinePhase::ExecutableConfigurations,
"executable-configurations",
"Compiles up to just before `hal.executable`s are translated, "
"including selection of translation strategies for codegen.");
callback(IREEVMPipelinePhase::ExecutableTargets, "executable-targets",
"Compiles up to translated `hal.executable`s, including codegen.");
callback(IREEVMPipelinePhase::HAL, "hal",
"Compiles up to the `hal` dialect, including codegen.");
callback(IREEVMPipelinePhase::VM, "vm", "Compiles up to the `vm` dialect.");
callback(IREEVMPipelinePhase::End, "end",
"Complete the full compilation pipeline.");
}
// Hooks for injecting behavior into the IREEVM pipeline. Since these are not
// derived from CLI options, we maintain them as a separate struct.
struct IREEVMPipelineHooks {
// If the GlobalOptimizationOptions::constEval option is true, then
// this callback must be set to populate a pass manager to perform
// constant eval. It typically just adds a ConstEval::createJitGlobalsPass()
// pass. It must be injected like this to avoid circular dependencies from
// the constant evaluator, which needs to recursively invoke these
// pipelines.
std::function<void(OpPassManager &)> buildConstEvalPassPipelineCallback;
// Called immediately before a compilation phase.
std::function<void(IREEVMPipelinePhase phase, OpPassManager &)> beforePhase;
// Called immediately after a compilation phase.
std::function<void(IREEVMPipelinePhase phase, OpPassManager &)> afterPhase;
// Applies pipeline extensions to the built pipeline if not nullptr.
PipelineExtensions *pipelineExtensions = nullptr;
operator IREE::HAL::PipelineHooks() const;
};
// Builds a pass pipeline to perform pre-compilation global optimizations.
void buildIREEPrecompileTransformPassPipeline(
const IREE::HAL::TargetRegistry &targetRegistry,
GlobalPipelineOptions pipelineOptions, BindingOptions bindingOptions,
InputDialectOptions inputOptions, PreprocessingOptions preprocessingOptions,
ParameterOptions parameterOptions,
GlobalOptimizationOptions highLevelOptimizationOptions,
DispatchCreationOptions dispatchCreationOptions,
SchedulingOptions schedulingOptions,
IREE::HAL::TargetOptions halTargetOptions, IREEVMPipelineHooks &hooks,
OpPassManager &passManager,
IREEVMPipelinePhase compileFrom = IREEVMPipelinePhase::Start,
IREEVMPipelinePhase compileTo = IREEVMPipelinePhase::GlobalOptimization);
// Builds a pass pipeline to perform end-to-end compilation from a
// supported MLIR-based input to the IREE vm dialect.
//
// If a |runTo| phase is specified the pipeline will stop and output the full
// IR after the phase completes.
void buildIREEVMTransformPassPipeline(
const IREE::HAL::TargetRegistry &targetRegistry,
GlobalPipelineOptions pipelineOptions, BindingOptions bindingOptions,
InputDialectOptions inputOptions, PreprocessingOptions preprocessingOptions,
ParameterOptions parameterOptions,
GlobalOptimizationOptions highLevelOptimizationOptions,
DispatchCreationOptions dispatchCreationOptions,
SchedulingOptions schedulingOptions,
IREE::HAL::TargetOptions halTargetOptions,
IREE::VM::TargetOptions vmTargetOptions, IREEVMPipelineHooks &hooks,
OpPassManager &passManager,
IREEVMPipelinePhase compileFrom = IREEVMPipelinePhase::Start,
IREEVMPipelinePhase compileTo = IREEVMPipelinePhase::End);
// Builds the above with options initialized from flags.
void buildDefaultIREEVMTransformPassPipeline(OpPassManager &passManager);
// Registration hooks.
void registerIREEVMTransformPassPipeline();
} // namespace mlir::iree_compiler
#endif // IREE_COMPILER_PIPELINES_PIPELINES_H_