@@ -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