| Index: src/IceGlobalContext.cpp
|
| diff --git a/src/IceGlobalContext.cpp b/src/IceGlobalContext.cpp
|
| index d353bfe3874352d9ee789a218c84c5ab5a115634..ae755e8939bf01a87765fc6aecec487c786672fd 100644
|
| --- a/src/IceGlobalContext.cpp
|
| +++ b/src/IceGlobalContext.cpp
|
| @@ -256,7 +256,10 @@ GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError,
|
| : ConstPool(new ConstantPool()), ErrorStatus(), StrDump(OsDump),
|
| StrEmit(OsEmit), StrError(OsError), ObjectWriter(),
|
| OptQ(/*Sequential=*/Flags.isSequential(),
|
| - /*MaxSize=*/Flags.getNumTranslationThreads()),
|
| + /*MaxSize=*/
|
| + (Flags.getParseParallel() && Flags.getBuildOnRead())
|
| + ? MaxOptQSize
|
| + : Flags.getNumTranslationThreads()),
|
| // EmitQ is allowed unlimited size.
|
| EmitQ(/*Sequential=*/Flags.isSequential()),
|
| DataLowering(TargetDataLowering::createLowering(this)) {
|
| @@ -309,7 +312,8 @@ GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError,
|
|
|
| void GlobalContext::translateFunctions() {
|
| TimerMarker Timer(TimerStack::TT_translateFunctions, this);
|
| - while (std::unique_ptr<Cfg> Func = optQueueBlockingPop()) {
|
| + while (std::unique_ptr<OptWorkItem> OptItem = optQueueBlockingPop()) {
|
| + std::unique_ptr<Cfg> Func = OptItem->getParsedCfg();
|
| // Install Func in TLS for Cfg-specific container allocators.
|
| CfgLocalAllocatorScope _(Func.get());
|
| // Reset per-function stats being accumulated in TLS.
|
| @@ -867,19 +871,19 @@ void GlobalContext::setTimerName(TimerStackIdT StackID,
|
| // interface to take and transfer ownership, but they internally store the raw
|
| // Cfg pointer in the work queue. This allows e.g. future queue optimizations
|
| // such as the use of atomics to modify queue elements.
|
| -void GlobalContext::optQueueBlockingPush(std::unique_ptr<Cfg> Func) {
|
| - assert(Func);
|
| +void GlobalContext::optQueueBlockingPush(std::unique_ptr<OptWorkItem> Item) {
|
| + assert(Item);
|
| {
|
| TimerMarker _(TimerStack::TT_qTransPush, this);
|
| - OptQ.blockingPush(std::move(Func));
|
| + OptQ.blockingPush(std::move(Item));
|
| }
|
| if (getFlags().isSequential())
|
| translateFunctions();
|
| }
|
|
|
| -std::unique_ptr<Cfg> GlobalContext::optQueueBlockingPop() {
|
| +std::unique_ptr<OptWorkItem> GlobalContext::optQueueBlockingPop() {
|
| TimerMarker _(TimerStack::TT_qTransPop, this);
|
| - return std::unique_ptr<Cfg>(OptQ.blockingPop());
|
| + return std::unique_ptr<OptWorkItem>(OptQ.blockingPop());
|
| }
|
|
|
| void GlobalContext::emitQueueBlockingPush(
|
|
|