Diff
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/ChangeLog 2019-02-18 16:13:50 UTC (rev 241683)
@@ -1,3 +1,47 @@
+2019-02-15 Yusuke Suzuki <ysuz...@apple.com>
+
+ [JSC] Do not even allocate JIT worklists in non-JIT mode
+ https://bugs.webkit.org/show_bug.cgi?id=194693
+
+ Reviewed by Mark Lam.
+
+ Heap always allocates JIT worklists for Baseline, DFG, and FTL. While they do not have actual threads, Worklist itself already allocates some memory.
+ And we do not perform any GC operations that are only meaningful in JIT environment.
+
+ 1. We add VM::canUseJIT() check in Heap's ensureXXXWorklist things to prevent them from being allocated.
+ 2. We remove DFG marking constraint in non-JIT mode.
+ 3. We do not gather conservative roots from scratch buffers under the non-JIT mode (BTW, # of scratch buffers are always zero in non-JIT mode)
+ 4. We do not visit JITStubRoutineSet.
+ 5. Align JITWorklist function names to the other worklists.
+
+ * dfg/DFGOSRExitPreparation.cpp:
+ (JSC::DFG::prepareCodeOriginForOSRExit):
+ * dfg/DFGPlan.h:
+ * dfg/DFGWorklist.cpp:
+ (JSC::DFG::markCodeBlocks): Deleted.
+ * dfg/DFGWorklist.h:
+ * heap/Heap.cpp:
+ (JSC::Heap::completeAllJITPlans):
+ (JSC::Heap::iterateExecutingAndCompilingCodeBlocks):
+ (JSC::Heap::gatherScratchBufferRoots):
+ (JSC::Heap::removeDeadCompilerWorklistEntries):
+ (JSC::Heap::stopThePeriphery):
+ (JSC::Heap::suspendCompilerThreads):
+ (JSC::Heap::resumeCompilerThreads):
+ (JSC::Heap::addCoreConstraints):
+ * jit/JITWorklist.cpp:
+ (JSC::JITWorklist::existingGlobalWorklistOrNull):
+ (JSC::JITWorklist::ensureGlobalWorklist):
+ (JSC::JITWorklist::instance): Deleted.
+ * jit/JITWorklist.h:
+ * llint/LLIntSlowPaths.cpp:
+ (JSC::LLInt::jitCompileAndSetHeuristics):
+ * runtime/VM.cpp:
+ (JSC::VM::~VM):
+ (JSC::VM::gatherScratchBufferRoots):
+ (JSC::VM::gatherConservativeRoots): Deleted.
+ * runtime/VM.h:
+
2019-02-15 Saam barati <sbar...@apple.com>
[WebAssembly] Write a new register allocator for Air O0 and make BBQ use it
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGOSRExitPreparation.cpp (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGOSRExitPreparation.cpp 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGOSRExitPreparation.cpp 2019-02-18 16:13:50 UTC (rev 241683)
@@ -43,7 +43,7 @@
for (; codeOrigin.inlineCallFrame; codeOrigin = codeOrigin.inlineCallFrame->directCaller) {
CodeBlock* codeBlock = codeOrigin.inlineCallFrame->baselineCodeBlock.get();
- JITWorklist::instance()->compileNow(codeBlock);
+ JITWorklist::ensureGlobalWorklist().compileNow(codeBlock);
}
}
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGPlan.h (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGPlan.h 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGPlan.h 2019-02-18 16:13:50 UTC (rev 241683)
@@ -70,7 +70,6 @@
CompilationKey key();
- void markCodeBlocks(SlotVisitor&);
template<typename Func>
void iterateCodeBlocksForGC(const Func&);
void checkLivenessAndVisitChildren(SlotVisitor&);
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGWorklist.cpp (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGWorklist.cpp 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGWorklist.cpp 2019-02-18 16:13:50 UTC (rev 241683)
@@ -661,10 +661,6 @@
{
}
-void markCodeBlocks(VM&, SlotVisitor&)
-{
-}
-
#endif // ENABLE(DFG_JIT)
} } // namespace JSC::DFG
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGWorklist.h (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGWorklist.h 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/dfg/DFGWorklist.h 2019-02-18 16:13:50 UTC (rev 241683)
@@ -144,7 +144,6 @@
#endif // ENABLE(DFG_JIT)
void completeAllPlansForVM(VM&);
-void markCodeBlocks(VM&, SlotVisitor&);
template<typename Func>
void iterateCodeBlocksForGC(VM&, const Func&);
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/heap/Heap.cpp (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/heap/Heap.cpp 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/heap/Heap.cpp 2019-02-18 16:13:50 UTC (rev 241683)
@@ -599,8 +599,10 @@
void Heap::completeAllJITPlans()
{
+ if (!VM::canUseJIT())
+ return;
#if ENABLE(JIT)
- JITWorklist::instance()->completeAllForVM(*m_vm);
+ JITWorklist::ensureGlobalWorklist().completeAllForVM(*m_vm);
#endif // ENABLE(JIT)
DFG::completeAllPlansForVM(*m_vm);
}
@@ -609,7 +611,8 @@
void Heap::iterateExecutingAndCompilingCodeBlocks(const Func& func)
{
m_codeBlocks->iterateCurrentlyExecuting(func);
- DFG::iterateCodeBlocksForGC(*m_vm, func);
+ if (VM::canUseJIT())
+ DFG::iterateCodeBlocksForGC(*m_vm, func);
}
template<typename Func>
@@ -667,7 +670,9 @@
void Heap::gatherScratchBufferRoots(ConservativeRoots& roots)
{
#if ENABLE(DFG_JIT)
- m_vm->gatherConservativeRoots(roots);
+ if (!VM::canUseJIT())
+ return;
+ m_vm->gatherScratchBufferRoots(roots);
#else
UNUSED_PARAM(roots);
#endif
@@ -684,6 +689,8 @@
void Heap::removeDeadCompilerWorklistEntries()
{
#if ENABLE(DFG_JIT)
+ if (!VM::canUseJIT())
+ return;
for (unsigned i = DFG::numberOfWorklists(); i--;)
DFG::existingWorklistForIndex(i).removeDeadPlans(*m_vm);
#endif
@@ -1586,9 +1593,9 @@
});
#if ENABLE(JIT)
- {
+ if (VM::canUseJIT()) {
DeferGCForAWhile awhile(*this);
- if (JITWorklist::instance()->completeAllForVM(*m_vm)
+ if (JITWorklist::ensureGlobalWorklist().completeAllForVM(*m_vm)
&& conn == GCConductor::Collector)
setGCDidJIT();
}
@@ -2093,6 +2100,8 @@
// We ensure the worklists so that it's not possible for the mutator to start a new worklist
// after we have suspended the ones that he had started before. That's not very expensive since
// the worklists use AutomaticThreads anyway.
+ if (!VM::canUseJIT())
+ return;
for (unsigned i = DFG::numberOfWorklists(); i--;)
DFG::ensureWorklistForIndex(i).suspendAllThreads();
#endif
@@ -2310,6 +2319,8 @@
void Heap::resumeCompilerThreads()
{
#if ENABLE(DFG_JIT)
+ if (!VM::canUseJIT())
+ return;
for (unsigned i = DFG::numberOfWorklists(); i--;)
DFG::existingWorklistForIndex(i).resumeAllThreads();
#endif
@@ -2640,7 +2651,7 @@
SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::ConservativeScan);
slotVisitor.append(conservativeRoots);
}
- {
+ if (VM::canUseJIT()) {
// JITStubRoutines must be visited after scanning ConservativeRoots since JITStubRoutines depend on the hook executed during gathering ConservativeRoots.
SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::JITStubRoutines);
m_jitStubRoutines->traceMarkedStubRoutines(slotVisitor);
@@ -2744,26 +2755,28 @@
ConstraintParallelism::Parallel);
#if ENABLE(DFG_JIT)
- m_constraintSet->add(
- "Dw", "DFG Worklists",
- [this] (SlotVisitor& slotVisitor) {
- SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::DFGWorkLists);
+ if (VM::canUseJIT()) {
+ m_constraintSet->add(
+ "Dw", "DFG Worklists",
+ [this] (SlotVisitor& slotVisitor) {
+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::DFGWorkLists);
- for (unsigned i = DFG::numberOfWorklists(); i--;)
- DFG::existingWorklistForIndex(i).visitWeakReferences(slotVisitor);
-
- // FIXME: This is almost certainly unnecessary.
- // https://bugs.webkit.org/show_bug.cgi?id=166829
- DFG::iterateCodeBlocksForGC(
- *m_vm,
- [&] (CodeBlock* codeBlock) {
- slotVisitor.appendUnbarriered(codeBlock);
- });
-
- if (Options::logGC() == GCLogging::Verbose)
- dataLog("DFG Worklists:\n", slotVisitor);
- },
- ConstraintVolatility::GreyedByMarking);
+ for (unsigned i = DFG::numberOfWorklists(); i--;)
+ DFG::existingWorklistForIndex(i).visitWeakReferences(slotVisitor);
+
+ // FIXME: This is almost certainly unnecessary.
+ // https://bugs.webkit.org/show_bug.cgi?id=166829
+ DFG::iterateCodeBlocksForGC(
+ *m_vm,
+ [&] (CodeBlock* codeBlock) {
+ slotVisitor.appendUnbarriered(codeBlock);
+ });
+
+ if (Options::logGC() == GCLogging::Verbose)
+ dataLog("DFG Worklists:\n", slotVisitor);
+ },
+ ConstraintVolatility::GreyedByMarking);
+ }
#endif
m_constraintSet->add(
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/jit/JITWorklist.cpp (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/jit/JITWorklist.cpp 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/jit/JITWorklist.cpp 2019-02-18 16:13:50 UTC (rev 241683)
@@ -322,16 +322,24 @@
}
}
-JITWorklist* JITWorklist::instance()
+static JITWorklist* theGlobalJITWorklist { nullptr };
+
+JITWorklist* JITWorklist::existingGlobalWorklistOrNull()
{
- static JITWorklist* worklist;
+ return theGlobalJITWorklist;
+}
+
+JITWorklist& JITWorklist::ensureGlobalWorklist()
+{
static std::once_flag once;
std::call_once(
once,
[] {
- worklist = new JITWorklist();
+ auto* worklist = new JITWorklist();
+ WTF::storeStoreFence();
+ theGlobalJITWorklist = worklist;
});
- return worklist;
+ return *theGlobalJITWorklist;
}
} // namespace JSC
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/jit/JITWorklist.h (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/jit/JITWorklist.h 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/jit/JITWorklist.h 2019-02-18 16:13:50 UTC (rev 241683)
@@ -57,7 +57,8 @@
void compileNow(CodeBlock*, unsigned loopOSREntryBytecodeOffset = 0);
- static JITWorklist* instance();
+ static JITWorklist& ensureGlobalWorklist();
+ static JITWorklist* existingGlobalWorklistOrNull();
private:
JITWorklist();
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/llint/LLIntSlowPaths.cpp (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/llint/LLIntSlowPaths.cpp 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/llint/LLIntSlowPaths.cpp 2019-02-18 16:13:50 UTC (rev 241683)
@@ -369,6 +369,7 @@
{
VM& vm = exec->vm();
DeferGCForAWhile deferGC(vm.heap); // My callers don't set top callframe, so we don't want to GC here at all.
+ ASSERT(VM::canUseJIT());
codeBlock->updateAllValueProfilePredictions();
@@ -379,7 +380,7 @@
return false;
}
- JITWorklist::instance()->poll(vm);
+ JITWorklist::ensureGlobalWorklist().poll(vm);
switch (codeBlock->jitType()) {
case JITCode::BaselineJIT: {
@@ -389,7 +390,7 @@
return true;
}
case JITCode::InterpreterThunk: {
- JITWorklist::instance()->compileLater(codeBlock, loopOSREntryBytecodeOffset);
+ JITWorklist::ensureGlobalWorklist().compileLater(codeBlock, loopOSREntryBytecodeOffset);
return codeBlock->jitType() == JITCode::BaselineJIT;
}
default:
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.cpp (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.cpp 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.cpp 2019-02-18 16:13:50 UTC (rev 241683)
@@ -498,8 +498,8 @@
Gigacage::removePrimitiveDisableCallback(primitiveGigacageDisabledCallback, this);
promiseDeferredTimer->stopRunningTasks();
#if ENABLE(WEBASSEMBLY)
- if (Wasm::existingWorklistOrNull())
- Wasm::ensureWorklist().stopAllPlansForContext(wasmContext);
+ if (Wasm::Worklist* worklist = Wasm::existingWorklistOrNull())
+ worklist->stopAllPlansForContext(wasmContext);
#endif
if (UNLIKELY(m_watchdog))
m_watchdog->willDestroyVM(this);
@@ -517,7 +517,8 @@
#endif // ENABLE(SAMPLING_PROFILER)
#if ENABLE(JIT)
- JITWorklist::instance()->completeAllForVM(*this);
+ if (JITWorklist* worklist = JITWorklist::existingGlobalWorklistOrNull())
+ worklist->completeAllForVM(*this);
#endif // ENABLE(JIT)
#if ENABLE(DFG_JIT)
@@ -922,7 +923,7 @@
}
#if ENABLE(DFG_JIT)
-void VM::gatherConservativeRoots(ConservativeRoots& conservativeRoots)
+void VM::gatherScratchBufferRoots(ConservativeRoots& conservativeRoots)
{
auto lock = holdLock(m_scratchBufferLock);
for (auto* scratchBuffer : m_scratchBuffers) {
Modified: releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.h (241682 => 241683)
--- releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.h 2019-02-18 16:13:43 UTC (rev 241682)
+++ releases/WebKitGTK/webkit-2.24/Source/_javascript_Core/runtime/VM.h 2019-02-18 16:13:50 UTC (rev 241683)
@@ -740,7 +740,7 @@
return m_exceptionFuzzBuffer.get();
}
- void gatherConservativeRoots(ConservativeRoots&);
+ void gatherScratchBufferRoots(ConservativeRoots&);
VMEntryScope* entryScope;