[LLVMdev] strange behaviour after extracting optimization pass code

Ralf Karrenberg Chareos at gmx.de
Fri Dec 19 05:59:52 PST 2008


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




More information about the llvm-dev mailing list