blob: 6ef72b5a45e41cbf25220e88ea112f07c72e6836 [file] [edit]
// 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_COMPILER_GLOBALOPTIMIZATION_PASSES_H_
#define IREE_COMPILER_GLOBALOPTIMIZATION_PASSES_H_
#include <functional>
#include "iree/compiler/Pipelines/Options.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/Interfaces/FunctionInterfaces.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
namespace mlir::iree_compiler::GlobalOptimization {
struct TransformOptions : PassPipelineOptions<TransformOptions> {
ListOption<std::string> parameterImportPaths{
*this,
"parameter-import-paths",
llvm::cl::desc("File paths to archives to import parameters from with an "
"optional `scope=` prefix."),
};
ListOption<std::string> parameterImportKeys{
*this,
"parameter-import-keys",
llvm::cl::desc("List of parameter keys to import. Any matching keys from "
"any scope will be imported."),
};
Option<int64_t> parameterImportMaximumSize{
*this,
"parameter-import-maximum-size",
llvm::cl::desc("Maximum size of parameters to import or 0 to disable "
"automatic import."),
llvm::cl::init(0),
};
Option<std::string> parameterExportPath{
*this,
"parameter-export-path",
llvm::cl::desc("File path to an archive to export parameters to with an "
"optional `scope=` prefix."),
llvm::cl::init(""),
};
Option<int64_t> parameterExportMinimumSize{
*this,
"parameter-export-minimum-size",
llvm::cl::desc("Minimum size of constants to export as parameters."),
llvm::cl::init(0),
};
Option<std::string> parameterSplatPath{
*this,
"parameter-splat-path",
llvm::cl::desc("File path to create a splat parameter archive out of all "
"parameters in the module."),
llvm::cl::init(""),
};
Option<bool> aggressiveTransposePropagation{
*this,
"aggressive-transpose-propagation",
llvm::cl::desc(
"Enables aggressive propagation of transposes to the inputs of named "
"ops, rewriting named ops as fused generics."),
llvm::cl::init(false),
};
Option<bool> propagateTransposesThroughConv{
*this,
"propagate-transposes-through-conv",
llvm::cl::desc(
"Enables propagation of transpose ops through convolutions"),
llvm::cl::init(false),
};
Option<bool> sinkTransposeThroughPad{
*this,
"sink-transpose-through-pad",
llvm::cl::desc("Enables sinking transpose through pad operations"),
llvm::cl::init(false),
};
Option<bool> outerDimConcat{
*this,
"outer-dim-concat",
llvm::cl::desc("Enables transposing all concatenations to the outer most "
"dimension."),
llvm::cl::init(false),
};
Option<bool> dataTiling{
*this,
"data-tiling",
llvm::cl::desc("Enables data tiling in global optimization phase. There "
"are two data-tiling flags during the transition state. "
"The other has to be off if this one is enabled. Any "
"feature built on top of this path will be deprecated."),
llvm::cl::init(false),
};
Option<bool> constEval{
*this,
"const-eval",
llvm::cl::desc("Enables recursive evaluation of immutable globals using "
"the compiler and runtime."),
llvm::cl::init(true),
};
Option<bool> numericPrecisionReduction{
*this,
"numeric-precision-reduction",
llvm::cl::desc("Optimizations to reduce numeric precision where it is "
"safe to do so."),
llvm::cl::init(false),
};
Option<bool> stripAssertions{
*this,
"strip-assertions",
llvm::cl::desc("Strips debug assertions after any useful information has "
"been extracted."),
llvm::cl::init(false),
};
Option<bool> generalizeMatmul{
*this,
"generalize-matmul",
llvm::cl::desc("Converts linalg named matmul ops to linalg generic ops."),
llvm::cl::init(false),
};
Option<bool> useIm2colForConvs{
*this,
"use-im2col-for-convs",
llvm::cl::desc(
"Enables converting convolution operations to im2col + "
"matmul form to leverage optimized matmul implementations."),
llvm::cl::init(false),
};
Option<bool> constExprHoisting{
*this,
"const-expr-hoisting",
llvm::cl::desc("Enables hoisting of constant expressions."),
llvm::cl::init(true),
};
Option<int64_t> constExprMaxSizeIncreaseThreshold{
*this,
"const-expr-max-size-increase-threshold",
llvm::cl::desc(
"Maximum size increase threshold for constant expression hoisting."),
llvm::cl::init(1024 * 1024),
};
// Hook to populate a constant evaluation pass pipeline. If nullptr, then
// no passes are added for constant evaluation. This must be injected in
// because constant-evaluators can depend on the whole compiler, of which
// this is a part, and we maintain strict optionality for this component.
std::function<void(OpPassManager &passManager)> buildConstEvalPassPipeline;
};
/// Subset of the overall pass pipeline for optimizing globals and numerics.
/// We may ultimately break this out separately so creating a syntactic
/// distinction to keep that as an option.
void buildGlobalOptimizationPassPipeline(
OpPassManager &mainPassManager, const TransformOptions &transformOptions);
//------------------------------------------------------------------------------
// Wrappers that not use tablegen options.
//------------------------------------------------------------------------------
std::unique_ptr<Pass> createDecomposeConcatPass(bool enableConcatTransposition);
// Enum for selecting the target type for demotion
enum class DemoteType { F16, BF16 };
// Enum for selecting which operations to demote
enum class DemoteOperation { All, Conv, Matmul, None };
// Unified pass for demoting contraction inputs
std::unique_ptr<Pass>
createDemoteContractionInputsPass(DemoteType type, DemoteOperation operation);
std::unique_ptr<InterfacePass<mlir::FunctionOpInterface>>
createPropagateLinalgTransposePass(bool enableAggressivePropagation);
//----------------------------------------------------------------------------//
// Register GlobalOptimization Passes
//----------------------------------------------------------------------------//
#define GEN_PASS_DECL
#include "iree/compiler/GlobalOptimization/Passes.h.inc" // IWYU pragma: keep
void registerGlobalOptimizationPipeline();
} // namespace mlir::iree_compiler::GlobalOptimization
#endif // IREE_COMPILER_GLOBALOPTIMIZATION_PASSES_H_