Ralf Karrenberg
2008-Dec-19 13:57 UTC
[LLVMdev] strange behaviour after extracting optimization pass code
Hi, I am expieriencing strange behaviour of llvm's optimization passes and I don't understand what I am doing wrong. Basically all I've done is extracting code for optimization of a llvm-function in a llvm-module and put it into a separate function for better readability. The original code looks like follows (and works as expected): ----------------------------- std::string functionName = "main"; llvm::Module* mod = some arbitrary valid modulepointer; llvm::ExistingModuleProvider mp(mod); llvm::FunctionPassManager fpm(&mp); fpm.add(new llvm::TargetData(mod)); fpm.add(llvm::createInstructionCombiningPass()); fpm.add(llvm::createReassociatePass()); fpm.add(llvm::createGVNPass()); fpm.add(llvm::createCFGSimplificationPass()); fpm.run(*f); //...get execution engine //... call execEngine->getPointerToFunction() //... execute function ----------------------------- Now if I extract exactly this code and put it into a different method like follows, it produces a giant pile of data garbage in the console and any calls receiving the module-pointer after the optimization lead to a segfault. ----------------------------- void optimizeFunction(std::string functionName, llvm::Module* mod) { llvm::Function* f = mod->getFunction(functionName); llvm::ExistingModuleProvider mp(mod); llvm::FunctionPassManager fpm(&mp); fpm.add(new llvm::TargetData(mod)); fpm.add(llvm::createInstructionCombiningPass()); fpm.add(llvm::createReassociatePass()); fpm.add(llvm::createGVNPass()); fpm.add(llvm::createCFGSimplificationPass()); fpm.run(*f); } //in main function: std::string functionName = "main"; llvm::Module* mod = some arbitrary valid modulepointer; optimizeFunction("main", mod); //...get execution engine //... call execEngine->getPointerToFunction() //... execute function ----------------------------- Can anyone help me out here? Thanks in advance :) Cheers, Ralf
Duncan Sands
2008-Dec-19 15:53 UTC
[LLVMdev] strange behaviour after extracting optimization pass code
Hi,> void optimizeFunction(std::string functionName, llvm::Module* mod) { > llvm::Function* f = mod->getFunction(functionName); > > llvm::ExistingModuleProvider mp(mod); > llvm::FunctionPassManager fpm(&mp);maybe when you leave this function the above two objects are being finalized and freeing memory? Ciao, Duncan.