forked from matthewbdwyer/tipc
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOptimizer.cpp
More file actions
63 lines (47 loc) · 2.5 KB
/
Copy pathOptimizer.cpp
File metadata and controls
63 lines (47 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "Optimizer.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/Scalar/GVN.h"
#include "llvm/Transforms/Scalar/Reassociate.h"
#include "llvm/Transforms/Scalar/SimplifyCFG.h"
#include "llvm/Transforms/Utils/Mem2Reg.h"
#include "loguru.hpp"
// Minimal optimization pass using LLVM pass managers
void Optimizer::optimize(llvm::Module *theModule) {
LOG_S(1) << "Optimizing program " << theModule->getName().str();
// New pass builder
llvm::PassBuilder passBuilder;
// Setting-up Analysis Managers for different granularities of optimizations
llvm::FunctionAnalysisManager functionAnalysisManager;
llvm::ModuleAnalysisManager moduleAnalysisManager;
llvm::LoopAnalysisManager loopAnalysisManager;
llvm::CGSCCAnalysisManager cgsccAnalysisManager;
// Registering the analysis managers with the pass builder
passBuilder.registerModuleAnalyses(moduleAnalysisManager);
passBuilder.registerCGSCCAnalyses(cgsccAnalysisManager);
passBuilder.registerFunctionAnalyses(functionAnalysisManager);
passBuilder.registerLoopAnalyses(loopAnalysisManager);
// Cross Register Proxies so that analysis results can be reused as needed.
passBuilder.crossRegisterProxies(loopAnalysisManager, functionAnalysisManager,
cgsccAnalysisManager, moduleAnalysisManager);
// Initiating Function and Module level PassManagers
llvm::ModulePassManager modulePassManager;
llvm::FunctionPassManager functionPassManager;
// Adding passes to the pipeline
// Constructs SSA and is a pre-requisite for many other passes
functionPassManager.addPass(llvm::PromotePass());
// Instruction combine pass scans for a variety of patterns and replaces bitcodes matched with improvements.
functionPassManager.addPass(llvm::InstCombinePass());
// Reassociate expressions.
functionPassManager.addPass(llvm::ReassociatePass());
// Eliminate Common SubExpressions using the Global Value Numbering (GVN) algorithm.
functionPassManager.addPass(llvm::GVNPass());
// Simplify the control flow graph (deleting unreachable blocks, etc).
functionPassManager.addPass(llvm::SimplifyCFGPass());
// Passing the function pass manager to the modulePassManager using a function
// adaptor, then passing theModule to the ModulePassManager along with
// ModuleAnalysisManager.
modulePassManager.addPass(
createModuleToFunctionPassAdaptor(std::move(functionPassManager)));
modulePassManager.run(*theModule, moduleAnalysisManager);
}