Skip to content

Commit 10538cd

Browse files
committed
Reduce LLVM optimization time
1 parent 6469583 commit 10538cd

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

src/dev/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,14 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
7676
llvm::Value *targetLists = func->getArg(3);
7777
llvm::Value *warpArg = nullptr;
7878

79-
if (m_procedurePrototype) {
80-
func->addFnAttr(llvm::Attribute::AlwaysInline);
79+
if (m_procedurePrototype)
8180
warpArg = func->getArg(4);
81+
82+
if (m_procedurePrototype && m_warp)
83+
func->addFnAttr(llvm::Attribute::InlineHint);
84+
else {
85+
func->addFnAttr(llvm::Attribute::NoInline);
86+
func->addFnAttr(llvm::Attribute::OptimizeNone);
8287
}
8388

8489
llvm::BasicBlock *entry = llvm::BasicBlock::Create(m_llvmCtx, "entry", func);
@@ -1106,6 +1111,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
11061111
// bool resume(void *)
11071112
funcName = getResumeFunctionName(m_procedurePrototype);
11081113
llvm::Function *resumeFunc = getOrCreateFunction(funcName, m_resumeFuncType);
1114+
resumeFunc->addFnAttr(llvm::Attribute::NoInline);
1115+
resumeFunc->addFnAttr(llvm::Attribute::OptimizeNone);
11091116

11101117
entry = llvm::BasicBlock::Create(m_llvmCtx, "entry", resumeFunc);
11111118
m_builder.SetInsertPoint(entry);

src/dev/engine/internal/llvm/llvmcompilercontext.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ void LLVMCompilerContext::initJit()
5757
#endif
5858

5959
// Optimize
60+
const auto &functions = m_module->getFunctionList();
61+
6062
llvm::PassBuilder passBuilder;
6163
llvm::LoopAnalysisManager loopAnalysisManager;
6264
llvm::FunctionAnalysisManager functionAnalysisManager;
@@ -69,9 +71,27 @@ void LLVMCompilerContext::initJit()
6971
passBuilder.registerLoopAnalyses(loopAnalysisManager);
7072
passBuilder.crossRegisterProxies(loopAnalysisManager, functionAnalysisManager, cGSCCAnalysisManager, moduleAnalysisManager);
7173

72-
llvm::ModulePassManager modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::OptimizationLevel::O3);
74+
// Use O0 for the entire module
75+
llvm::ModulePassManager modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::OptimizationLevel::O0);
76+
77+
// Create a FunctionPassManager for O3 optimizations
78+
llvm::FunctionPassManager functionPassManager = passBuilder.buildFunctionSimplificationPipeline(llvm::OptimizationLevel::O3, llvm::ThinOrFullLTOPhase::None);
79+
80+
// Run the O0 pipeline for the module
7381
modulePassManager.run(*m_module, moduleAnalysisManager);
7482

83+
// Run the O3 pipeline for specific functions
84+
for (llvm::Function &func : m_module->functions()) {
85+
if (!func.isDeclaration()) {
86+
if (!func.hasFnAttribute(llvm::Attribute::OptimizeNone)) {
87+
#ifndef NDEBUG
88+
std::cout << "debug: optimizing function: " << functionNames.back() << std::endl;
89+
#endif
90+
functionPassManager.run(func, functionAnalysisManager);
91+
}
92+
}
93+
}
94+
7595
// Init JIT compiler
7696
std::string name = m_module->getName().str();
7797
auto err = m_jit->get()->addIRModule(llvm::orc::ThreadSafeModule(std::move(m_module), std::move(m_llvmCtx)));

0 commit comments

Comments
 (0)