[LLVMdev] LLVM optimization passes crash when running on second thread
Peter Zion
peter.zion at fabric-engine.com
Tue Mar 22 13:23:42 PDT 2011
That was exactly the problem, thank you!
pz
On 2011-03-22, at 3:27 PM, Eli Friedman wrote:
> On Tue, Mar 22, 2011 at 11:51 AM, Peter Zion
> <peter.zion at fabric-engine.com> wrote:
>> Hello,
>>
>> I am trying to modify my LLVM-based compiler to perform an initial, no-optimization compilation synchronously on startup and then perform an asynchronous, optimized recompilation in the background, and I am getting in one of the optimization passes.
>>
>> - I am using the official release of LLVM 2.8
>> - I have compiled LLVM with threading enabled; I am running llvm::llvm_start_multithreaded() on application startup and checking that that result is true.
>> - The foreground compilation works fine.
>> - The background compilation also works fine if I comment out the addition of the optimization passes.
>> - The optimization passes are being added as follows:
>> llvm::OwningPtr<llvm::PassManager> passManager( new llvm::PassManager );
>> if ( optimize )
>> {
>> llvm::createStandardFunctionPasses( passManager.get(), 2 );
>> llvm::createStandardModulePasses( passManager.get(), 2, false, true, true, true, false, llvm::createFunctionInliningPass() );
>> llvm::createStandardLTOPasses( passManager.get(), true, true, false );
>> }
>> passManager->run( *module );
>> - If I *don't* comment out the optimization passes (inside the if statement above) LLVM crashes with what appears to be a stack overflow; I've attached the stack trace below.
>> - The code above is in the Fabric::DG::Code::compileAST() function shown in the stack trace below; its child in the stack is the passManager->run() call.
>> - I have added a global mutex lock around all my accesses to LLVM, just to try to debug the problem, and it doesn't make any difference.
>> - Both compilations are using the same LLVMContext. It is unclear from the LLVM docs whether this is allowed. I would be surprised, however, if the global lock I added wouldn't have sorted out that issue if it was the problem.
>> - In case it makes any difference, I am running on OS X and using Grand Central Dispatch to execute the background compilation using dispatch_group_async_f()
>>
>> Is this a known problem? Can anyone suggest anything I can do to fix or further debug this problem?
>
> My best guess is that your background thread has less stack space than
> the main thread. The version of LazyValueInfo which is in 2.8 was
> recursive, and can use a lot of stack space in extreme cases (this was
> fixed for 2.9, which should be released soon). If you need to use
> 2.8, I would suggest either allocating more stack space, or
> customizing the passes you use not to include -jump-threading and
> -correlated-propagation.
>
> -Eli
More information about the llvm-dev
mailing list