Skip to content
This repository was archived by the owner on Jul 3, 2021. It is now read-only.

Commit b7212c3

Browse files
Add optimization passes controlled via -Ox command line flag
1 parent a4b88a0 commit b7212c3

File tree

6 files changed

+90
-7
lines changed

6 files changed

+90
-7
lines changed

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ endif()
3939
add_executable(JitFromScratch
4040
main.cpp
4141
JitFromScratch.cpp
42+
SimpleOptimizer.cpp
4243
)
4344

4445
target_include_directories(JitFromScratch PRIVATE
@@ -65,6 +66,7 @@ set(llvm_libs
6566
LLVMGlobalISel
6667
LLVMInstCombine
6768
LLVMInstrumentation
69+
LLVMipo
6870
LLVMJITLink
6971
LLVMLinker
7072
LLVMIRReader
@@ -81,6 +83,7 @@ set(llvm_libs
8183
LLVMSupport
8284
LLVMTarget
8385
LLVMTransformUtils
86+
LLVMVectorize
8487
LLVMX86AsmParser
8588
LLVMX86CodeGen
8689
LLVMX86Desc

JitFromScratch.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "JitFromScratch.h"
2+
#include "SimpleOptimizer.h"
23

34
#include <llvm/ExecutionEngine/Orc/CompileUtils.h>
45
#include <llvm/ExecutionEngine/Orc/ExecutionUtils.h>
@@ -7,6 +8,7 @@
78
#include <llvm/IR/Mangler.h>
89
#include <llvm/Support/Debug.h>
910
#include <llvm/Support/raw_ostream.h>
11+
#include <llvm/Transforms/IPO/PassManagerBuilder.h>
1012

1113
#define DEBUG_TYPE "jitfromscratch"
1214

@@ -18,7 +20,8 @@ JitFromScratch::JitFromScratch(ExitOnError ExitOnErr)
1820
TM(createTargetMachine(ExitOnErr)),
1921
GDBListener(JITEventListener::createGDBRegistrationListener()),
2022
ObjLinkingLayer(*ES, createMemoryManagerFtor()),
21-
CompileLayer(*ES, ObjLinkingLayer, SimpleCompiler(*TM)) {
23+
CompileLayer(*ES, ObjLinkingLayer, SimpleCompiler(*TM)),
24+
OptimizeLayer(*ES, CompileLayer) {
2225
ObjLinkingLayer.setNotifyLoaded(createNotifyLoadedFtor());
2326
if (auto R = createHostProcessResolver())
2427
ES->getMainJITDylib().setGenerator(std::move(R));
@@ -90,15 +93,18 @@ Error JitFromScratch::applyDataLayout(Module &M) {
9093
}
9194

9295
Error JitFromScratch::submitModule(std::unique_ptr<Module> M,
93-
std::unique_ptr<LLVMContext> C) {
96+
std::unique_ptr<LLVMContext> C,
97+
unsigned OptLevel) {
9498
LLVM_DEBUG(dbgs() << "Submit IR module:\n\n" << *M << "\n\n");
9599

96100
if (auto Err = applyDataLayout(*M))
97101
return Err;
98102

99-
return CompileLayer.add(ES->getMainJITDylib(),
100-
ThreadSafeModule(std::move(M), std::move(C)),
101-
ES->allocateVModule());
103+
OptimizeLayer.setTransform(SimpleOptimizer(OptLevel));
104+
105+
return OptimizeLayer.add(ES->getMainJITDylib(),
106+
ThreadSafeModule(std::move(M), std::move(C)),
107+
ES->allocateVModule());
102108
}
103109

104110
Expected<JITTargetAddress> JitFromScratch::getFunctionAddr(StringRef Name) {

JitFromScratch.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class JitFromScratch {
3636
}
3737

3838
llvm::Error submitModule(std::unique_ptr<llvm::Module> M,
39-
std::unique_ptr<llvm::LLVMContext> C);
39+
std::unique_ptr<llvm::LLVMContext> C,
40+
unsigned OptLevel);
4041

4142
template <class Signature_t>
4243
llvm::Expected<std::function<Signature_t>> getFunction(llvm::StringRef Name) {
@@ -54,6 +55,7 @@ class JitFromScratch {
5455

5556
llvm::orc::RTDyldObjectLinkingLayer ObjLinkingLayer;
5657
llvm::orc::IRCompileLayer CompileLayer;
58+
llvm::orc::IRTransformLayer OptimizeLayer;
5759

5860
llvm::orc::JITDylib::GeneratorFunction createHostProcessResolver();
5961

SimpleOptimizer.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "SimpleOptimizer.h"
2+
3+
#include <llvm/IR/LegacyPassManager.h>
4+
#include <llvm/Support/Debug.h>
5+
#include <llvm/Support/raw_ostream.h>
6+
7+
#define DEBUG_TYPE "jitfromscratch"
8+
9+
using namespace llvm;
10+
using namespace llvm::orc;
11+
12+
Expected<ThreadSafeModule>
13+
SimpleOptimizer::operator()(ThreadSafeModule TSM,
14+
const MaterializationResponsibility &) {
15+
Module &M = *TSM.getModule();
16+
17+
legacy::FunctionPassManager FPM(&M);
18+
B.populateFunctionPassManager(FPM);
19+
20+
FPM.doInitialization();
21+
for (Function &F : M)
22+
FPM.run(F);
23+
FPM.doFinalization();
24+
25+
legacy::PassManager MPM;
26+
B.populateModulePassManager(MPM);
27+
MPM.run(M);
28+
29+
LLVM_DEBUG(dbgs() << "Optimized IR module:\n\n" << M << "\n\n");
30+
31+
return std::move(TSM);
32+
}

SimpleOptimizer.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include <llvm/ExecutionEngine/Orc/Core.h>
4+
#include <llvm/ExecutionEngine/Orc/ThreadSafeModule.h>
5+
#include <llvm/Support/Error.h>
6+
#include <llvm/Transforms/IPO/PassManagerBuilder.h>
7+
8+
class SimpleOptimizer {
9+
public:
10+
SimpleOptimizer(unsigned OptLevel) { B.OptLevel = OptLevel; }
11+
12+
llvm::Expected<llvm::orc::ThreadSafeModule>
13+
operator()(llvm::orc::ThreadSafeModule TSM,
14+
const llvm::orc::MaterializationResponsibility &);
15+
16+
private:
17+
llvm::PassManagerBuilder B;
18+
};

main.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@
2121

2222
using namespace llvm;
2323

24+
static cl::opt<char>
25+
OptLevel("O",
26+
cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
27+
"(default = '-O2')"),
28+
cl::Prefix, cl::ZeroOrMore, cl::init(' '));
29+
30+
Expected<unsigned> getOptLevel() {
31+
switch (OptLevel) {
32+
case '0': return 0;
33+
case '1': return 1;
34+
case ' ':
35+
case '2': return 2;
36+
case '3': return 3;
37+
default:
38+
return createStringError(inconvertibleErrorCode(),
39+
"Invalid optimization level: -O%c",
40+
(char)OptLevel);
41+
}
42+
}
43+
2444
Expected<std::string> codegenIR(Module &module, unsigned items) {
2545
LLVMContext &ctx = module.getContext();
2646
IRBuilder<> B(ctx);
@@ -131,7 +151,9 @@ int main(int argc, char **argv) {
131151
M->setDataLayout(Jit.getDataLayout());
132152

133153
std::string JitedFnName = ExitOnErr(codegenIR(*M, arrayElements(x)));
134-
ExitOnErr(Jit.submitModule(std::move(M), std::move(C)));
154+
unsigned OptLevel = ExitOnErr(getOptLevel());
155+
156+
ExitOnErr(Jit.submitModule(std::move(M), std::move(C), OptLevel));
135157

136158
// Request function; this compiles to machine code and links.
137159
auto integerDistances =

0 commit comments

Comments
 (0)