blob: 88c0ade8a8ccdff7843761cd31277d35d1248d20 [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_VM_TRANSFORMS_PASSES_H_
#define IREE_COMPILER_DIALECT_VM_TRANSFORMS_PASSES_H_
#include <memory>
#include "iree/compiler/Dialect/VM/Conversion/TargetOptions.h"
#include "iree/compiler/Dialect/VM/IR/VMOps.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassRegistry.h"
namespace mlir::iree_compiler::IREE::VM {
//===----------------------------------------------------------------------===//
// Helpers
//===----------------------------------------------------------------------===//
// Adds a set of passes to the given pass manager that run the required VM
// 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 HAL/etc>
// buildVMTransformPassPipeline & run
// <run target serialization/etc>
void buildVMTransformPassPipeline(OpPassManager &passManager,
TargetOptions targetOptions);
void registerVMTransformPassPipeline();
//===----------------------------------------------------------------------===//
// Conversion
//===----------------------------------------------------------------------===//
// Converts from various dialects (standard, HAL, etc) to the VM dialect.
std::unique_ptr<OperationPass<mlir::ModuleOp>>
createConversionPass(TargetOptions targetOptions);
//===----------------------------------------------------------------------===//
// Module layout
//===----------------------------------------------------------------------===//
// Reifies and pads vm.rodata.table.inline ops as two vm.rodata.inline ops.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createReifyRodataTablesPass();
// Hoists inline vm.rodata.inline values to module-level constant storage.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createHoistInlinedRodataPass();
// Deduplicates vm.rodata ops in the module.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createDeduplicateRodataPass();
// Resolves global loads of rodata ops to direct rodata references.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createResolveRodataLoadsPass();
//===----------------------------------------------------------------------===//
// Module analysis and ordinal assignment
//===----------------------------------------------------------------------===//
// Gathers all module-level global init/deinit functions into single locations
// such that the runtime can init/deinit everything at once.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createGlobalInitializationPass();
// Assigns module-unique ordinals to function/global/etc symbols within the
// module.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createOrdinalAllocationPass();
//===----------------------------------------------------------------------===//
// Optimization passes
//===----------------------------------------------------------------------===//
// Drops __init/__deinit functions that have no ops.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>>
createDropEmptyModuleInitializersPass();
// Drops unused calls to functions marked as having no side effects.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>> createDropUnusedCallsPass();
// Sinks defining ops with few uses to their use-sites to reduce the total
// number of live registers at the cost of additional storage requirements.
std::unique_ptr<OperationPass<IREE::VM::ModuleOp>> createSinkDefiningOpsPass();
//===----------------------------------------------------------------------===//
// Register all Passes
//===----------------------------------------------------------------------===//
inline void registerVMPasses() {
auto targetOptions = TargetOptions::FromFlags::get();
registerVMTransformPassPipeline();
createConversionPass(targetOptions);
createHoistInlinedRodataPass();
createDeduplicateRodataPass();
createDropEmptyModuleInitializersPass();
createDropUnusedCallsPass();
createGlobalInitializationPass();
createOrdinalAllocationPass();
createResolveRodataLoadsPass();
createSinkDefiningOpsPass();
}
} // namespace mlir::iree_compiler::IREE::VM
#endif // IREE_COMPILER_DIALECT_VM_TRANSFORMS_PASSES_H_