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):

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):

Hi Ralf,

Your problem is that the ExistingModuleProvider takes ownership of the Module, deleting it when it goes out of scope. You would see the same behavior if you just offset the code with an unnamed block as shown below. The fix is simply to leave the 'mp' variable in the caller so it doesn't go out of scope before you're done with the Module.

— Gordon

-----------------------------
  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);

}

Thanks a lot ! :slight_smile:

Gordon Henriksen schrieb: