16#include "llvm/Analysis/TargetTransformInfo.h"
17#include "llvm/IR/Module.h"
18#include "llvm/Passes/OptimizationLevel.h"
19#include "llvm/Passes/PassBuilder.h"
20#include "llvm/Support/Error.h"
21#include "llvm/Support/FormatVariadic.h"
22#include "llvm/Target/TargetMachine.h"
27static std::optional<OptimizationLevel>
mapToLevel(
unsigned optLevel,
31 return OptimizationLevel::O0;
34 return OptimizationLevel::O1;
37 return OptimizationLevel::O2;
40 return OptimizationLevel::O3;
46std::function<
Error(Module *)>
48 TargetMachine *targetMachine) {
49 return [optLevel, sizeLevel, targetMachine](Module *m) ->
Error {
50 std::optional<OptimizationLevel> ol =
mapToLevel(optLevel, sizeLevel);
52 return make_error<StringError>(
53 formatv(
"invalid optimization/size level {0}/{1}", optLevel,
56 inconvertibleErrorCode());
58 LoopAnalysisManager lam;
59 FunctionAnalysisManager fam;
60 CGSCCAnalysisManager cgam;
61 ModuleAnalysisManager mam;
63 PipelineTuningOptions tuningOptions;
64 tuningOptions.LoopUnrolling =
true;
65 tuningOptions.LoopInterleaving =
true;
66 tuningOptions.LoopVectorization =
true;
67 tuningOptions.SLPVectorization =
true;
69 PassBuilder pb(targetMachine, tuningOptions);
71 pb.registerModuleAnalyses(mam);
72 pb.registerCGSCCAnalyses(cgam);
73 pb.registerFunctionAnalyses(fam);
74 pb.registerLoopAnalyses(lam);
75 pb.crossRegisterProxies(lam, fam, cgam, mam);
77 ModulePassManager mpm;
78 mpm.addPass(pb.buildPerModuleDefaultPipeline(*ol));
80 return Error::success();
static std::optional< OptimizationLevel > mapToLevel(unsigned optLevel, unsigned sizeLevel)
The OpAsmOpInterface, see OpAsmInterface.td for more details.
std::function< llvm::Error(llvm::Module *)> makeOptimizingTransformer(unsigned optLevel, unsigned sizeLevel, llvm::TargetMachine *targetMachine)
Create a module transformer function for MLIR ExecutionEngine that runs LLVM IR passes corresponding ...