Dibyendu Majumdar
2015-Mar-05 20:34 UTC
[LLVMdev] Question regarding MCJIT and optimization
Hi, I am wondering what the best way is to add optimization passes - I am using MCJIT in my project. I initially used the example in Kaleidoscope but found that I needed to add type based analysis to help optimize away redundant loads. Then I also discovered PassManagerBuilder. I have tried following two options but I don't know if a) what the recommended approach is, and b) is below correct way to use PassManagerBuilder. Any help / guidance will be very much appreciated. Regards Option 1 ----------- llvm::FunctionPassManager *FPM = new llvm::FunctionPassManager(module_); llvm::PassManager *MPM = new llvm::PassManager(); #if LLVM_VERSION_MINOR > 5 module_->setDataLayout(engine_->getDataLayout()); FPM->add(new llvm::DataLayoutPass()); #else auto target_layout = engine_->getTargetMachine()->getDataLayout(); module_->setDataLayout(target_layout); FPM->add(new llvm::DataLayoutPass(*engine_->getDataLayout())); #endif llvm::PassManagerBuilder pmb; pmb.OptLevel = 3; pmb.populateFunctionPassManager(*FPM); pmb.populateModulePassManager(*MPM); FPM->doInitialization(); // For each function in the module // Run the FPM on this function FPM->run(*function_); MPM->run(*module_); Option 2 ----------- llvm::FunctionPassManager *FPM = new llvm::FunctionPassManager(module_); #if LLVM_VERSION_MINOR > 5 // LLVM 3.6.0 change module_->setDataLayout(engine_->getDataLayout()); FPM->add(new llvm::DataLayoutPass()); #else auto target_layout = engine_->getTargetMachine()->getDataLayout(); module_->setDataLayout(target_layout); FPM->add(new llvm::DataLayoutPass(*engine_->getDataLayout())); #endif FPM->add(llvm::createTypeBasedAliasAnalysisPass()); // Provide basic AliasAnalysis support for GVN. FPM->add(llvm::createBasicAliasAnalysisPass()); FPM->add(llvm::createLICMPass()); // Promote allocas to registers. FPM->add(llvm::createPromoteMemoryToRegisterPass()); // Do simple "peephole" optimizations and bit-twiddling optzns. FPM->add(llvm::createInstructionCombiningPass()); // Reassociate expressions. FPM->add(llvm::createReassociatePass()); // Eliminate Common SubExpressions. FPM->add(llvm::createGVNPass()); // Simplify the control flow graph (deleting unreachable blocks, etc). FPM->add(llvm::createCFGSimplificationPass()); FPM->doInitialization(); // For each function in the module // Run the FPM on this function FPM->run(*function_);