[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