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( |