Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 1045bbc1a8e3b42ef926b776cb315219c1ba0d0d
https://github.com/WebKit/WebKit/commit/1045bbc1a8e3b42ef926b776cb315219c1ba0d0d
Author: Yusuke Suzuki <[email protected]>
Date: 2025-09-11 (Thu, 11 Sep 2025)
Changed paths:
M Source/JavaScriptCore/CMakeLists.txt
M Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
M Source/JavaScriptCore/Sources.txt
M Source/JavaScriptCore/wasm/WasmBBQJIT.cpp
M Source/JavaScriptCore/wasm/WasmBBQJIT.h
M Source/JavaScriptCore/wasm/WasmBBQJIT32_64.cpp
M Source/JavaScriptCore/wasm/WasmBBQJIT64.cpp
M Source/JavaScriptCore/wasm/WasmBBQPlan.cpp
M Source/JavaScriptCore/wasm/WasmBBQPlan.h
A Source/JavaScriptCore/wasm/WasmBaselineData.h
M Source/JavaScriptCore/wasm/WasmCallSlot.h
M Source/JavaScriptCore/wasm/WasmCallee.cpp
M Source/JavaScriptCore/wasm/WasmCallee.h
M Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp
A Source/JavaScriptCore/wasm/WasmMergedProfile.cpp
A Source/JavaScriptCore/wasm/WasmMergedProfile.h
M Source/JavaScriptCore/wasm/WasmModule.cpp
M Source/JavaScriptCore/wasm/WasmModule.h
M Source/JavaScriptCore/wasm/WasmOMGIRGenerator.cpp
M Source/JavaScriptCore/wasm/WasmOMGIRGenerator.h
M Source/JavaScriptCore/wasm/WasmOMGIRGenerator32_64.cpp
M Source/JavaScriptCore/wasm/WasmOMGPlan.cpp
M Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp
M Source/JavaScriptCore/wasm/WasmOperations.cpp
M Source/JavaScriptCore/wasm/WasmOperations.h
A Source/JavaScriptCore/wasm/WasmProfileCollection.cpp
A Source/JavaScriptCore/wasm/WasmProfileCollection.h
M Source/JavaScriptCore/wasm/WasmThunks.cpp
M Source/JavaScriptCore/wasm/WasmThunks.h
M Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp
M Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h
Log Message:
-----------
[JSC] Profile call_indirect / call_ref monomorphic target and do direct call
/ inlining in OMG
https://bugs.webkit.org/show_bug.cgi?id=298677
rdar://160312708
Reviewed by Yijia Huang.
This patch extends our profiling mechanism for wasm calls.
1. We start collecting per-instance level profiles instead of per-module
level. This is easier for us to collect more information without
locking. Previously, we were only collecting call counts, which is
fine for data race. But we would like to collect more complicated
profile information (like polymorphic call targets), and we do not
want to take a lock.
This per-instance data is chained by thread safe weak set from
module. And compiler will gather information through this backward
reference from module to this data collection.
2. (1)'s data pointer is stored in JSWebAssemblyInstance (to achieve
that, we were working on shrink some of sizes in
JSWebAssemblyInstance, like 299480@main etc.). And BBQ will load it
into GPRInfo::jitDataRegister. So the code can quickly access to this
information.
3. Call profiling is extended to collect boxed callee. Right now, we
only collect (1) init, (2) monomorphic, or (3) megamorphic status.
In OMG, we use this information, and attempt to directly call this
target when it is monomorphic and it is call_indirect / call_ref.
This allows us to remove many weird code around call_indirect etc.
And OMG even inlines calls when the monomorphic call target is small.
Right now, we only collect non-cross-instance calls.
4. The current limitation is this is only handling monomorphic calls. We
also found that polymorphic call collection is useful and effective
for some of real world code. So we will extend it later.
* Source/JavaScriptCore/CMakeLists.txt:
* Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:
* Source/JavaScriptCore/Sources.txt:
* Source/JavaScriptCore/wasm/WasmBBQJIT.cpp:
(JSC::Wasm::BBQJITImpl::BBQJIT::BBQJIT):
(JSC::Wasm::BBQJITImpl::BBQJIT::emitIncrementCallSlotCount):
(JSC::Wasm::BBQJITImpl::BBQJIT::addTopLevel):
(JSC::Wasm::BBQJITImpl::BBQJIT::addLoopOSREntrypoint):
(JSC::Wasm::BBQJITImpl::BBQJIT::emitIndirectCall):
(JSC::Wasm::BBQJITImpl::BBQJIT::addCallIndirect):
(JSC::Wasm::parseAndCompileBBQ):
* Source/JavaScriptCore/wasm/WasmBBQJIT.h:
* Source/JavaScriptCore/wasm/WasmBBQJIT32_64.cpp:
(JSC::Wasm::BBQJITImpl::BBQJIT::getGlobal):
(JSC::Wasm::BBQJITImpl::BBQJIT::setGlobal):
* Source/JavaScriptCore/wasm/WasmBBQJIT64.cpp:
(JSC::Wasm::BBQJITImpl::BBQJIT::getGlobal):
(JSC::Wasm::BBQJITImpl::BBQJIT::setGlobal):
(JSC::Wasm::BBQJITImpl::BBQJIT::emitAllocateGCArrayUninitialized):
(JSC::Wasm::BBQJITImpl::BBQJIT::emitAllocateGCStructUninitialized):
(JSC::Wasm::BBQJITImpl::BBQJIT::addCallRef):
* Source/JavaScriptCore/wasm/WasmBBQPlan.cpp:
(JSC::Wasm::BBQPlan::BBQPlan):
(JSC::Wasm::BBQPlan::compileFunction):
* Source/JavaScriptCore/wasm/WasmBBQPlan.h:
* Source/JavaScriptCore/wasm/WasmBaselineData.h: Copied from
Source/JavaScriptCore/wasm/WasmCallSlot.h.
* Source/JavaScriptCore/wasm/WasmCallSlot.h:
(JSC::Wasm::CallSlot::observeCrossInstanceCall):
(JSC::Wasm::CallSlot::observeCallIndirect):
(JSC::Wasm::CallSlot::boxedCallee const):
(JSC::Wasm::CallSlot::offsetOfBoxedCallee):
(JSC::Wasm::CallSlot::addressOfCount): Deleted.
* Source/JavaScriptCore/wasm/WasmCallee.cpp:
(JSC::Wasm::IPIntCallee::IPIntCallee):
(JSC::Wasm::IPIntCallee::needsProfiling const):
* Source/JavaScriptCore/wasm/WasmCallee.h:
* Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp:
(JSC::IPInt::jitCompileAndSetHeuristics):
(JSC::IPInt::jitCompileSIMDFunctionSynchronously):
(JSC::IPInt::WASM_IPINT_EXTERN_CPP_DECL):
* Source/JavaScriptCore/wasm/WasmMergedProfile.cpp: Copied from
Source/JavaScriptCore/wasm/WasmCallSlot.h.
(JSC::Wasm::MergedProfile::MergedProfile):
(JSC::Wasm::MergedProfile::CallSite::merge):
* Source/JavaScriptCore/wasm/WasmMergedProfile.h: Copied from
Source/JavaScriptCore/wasm/WasmCallSlot.h.
(JSC::Wasm::MergedProfile::CallSite::count const):
(JSC::Wasm::MergedProfile::CallSite::callee const):
(JSC::Wasm::MergedProfile::CallSite::isMegamorphic const):
(JSC::Wasm::MergedProfile::isCalled const):
(JSC::Wasm::MergedProfile::callee const):
(JSC::Wasm::MergedProfile::isMegamorphic const):
(JSC::Wasm::MergedProfile::mutableSpan):
(JSC::Wasm::MergedProfile::span const):
* Source/JavaScriptCore/wasm/WasmModule.cpp:
(JSC::Wasm::Module::createProfiles):
(JSC::Wasm::Module::createMergedProfile):
* Source/JavaScriptCore/wasm/WasmModule.h:
(JSC::Wasm::Module::ipintCallees const):
* Source/JavaScriptCore/wasm/WasmOMGIRGenerator.cpp:
(JSC::Wasm::OMGIRGenerator::OMGIRGenerator):
(JSC::Wasm::OMGIRGenerator::emitIndirectCall):
(JSC::Wasm::OMGIRGenerator::getGlobal):
(JSC::Wasm::OMGIRGenerator::setGlobal):
(JSC::Wasm::OMGIRGenerator::allocatorForWasmGCHeapCellSize):
(JSC::Wasm::OMGIRGenerator::allocateWasmGCArrayUninitialized):
(JSC::Wasm::OMGIRGenerator::allocateWasmGCStructUninitialized):
(JSC::Wasm::OMGIRGenerator::addInlinedReturn):
(JSC::Wasm::OMGIRGenerator::canInline const):
(JSC::Wasm::OMGIRGenerator::emitInlineDirectCall):
(JSC::Wasm::OMGIRGenerator::addCall):
(JSC::Wasm::OMGIRGenerator::emitDirectCall):
(JSC::Wasm::OMGIRGenerator::addCallIndirect):
(JSC::Wasm::OMGIRGenerator::addCallRef):
(JSC::Wasm::parseAndCompileOMG):
* Source/JavaScriptCore/wasm/WasmOMGIRGenerator.h:
* Source/JavaScriptCore/wasm/WasmOMGIRGenerator32_64.cpp:
(JSC::Wasm::OMGIRGenerator::OMGIRGenerator):
(JSC::Wasm::OMGIRGenerator::getGlobal):
(JSC::Wasm::OMGIRGenerator::setGlobal):
(JSC::Wasm::OMGIRGenerator::allocatorForWasmGCHeapCellSize):
(JSC::Wasm::OMGIRGenerator::allocateWasmGCArrayUninitialized):
(JSC::Wasm::OMGIRGenerator::allocateWasmGCStructUninitialized):
(JSC::Wasm::OMGIRGenerator::canInline const):
(JSC::Wasm::OMGIRGenerator::emitInlineDirectCall):
(JSC::Wasm::OMGIRGenerator::addCallIndirect):
(JSC::Wasm::parseAndCompileOMG):
* Source/JavaScriptCore/wasm/WasmOMGPlan.cpp:
(JSC::Wasm::OMGPlan::work):
* Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp:
(JSC::Wasm::OSREntryPlan::work):
* Source/JavaScriptCore/wasm/WasmOperations.cpp:
(JSC::Wasm::JSC_DEFINE_NOEXCEPT_JIT_OPERATION):
* Source/JavaScriptCore/wasm/WasmOperations.h:
* Source/JavaScriptCore/wasm/WasmProfileCollection.cpp: Copied from
Source/JavaScriptCore/wasm/WasmCallSlot.h.
(JSC::Wasm::ProfileCollection::create):
(JSC::Wasm::ProfileCollection::tryGetBaselineData):
(JSC::Wasm::ProfileCollection::registerBaselineData):
* Source/JavaScriptCore/wasm/WasmProfileCollection.h: Copied from
Source/JavaScriptCore/wasm/WasmCallSlot.h.
* Source/JavaScriptCore/wasm/WasmThunks.cpp:
(JSC::Wasm::materializeBaselineDataGenerator):
* Source/JavaScriptCore/wasm/WasmThunks.h:
* Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp:
(JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
(JSC::JSWebAssemblyInstance::finishCreation):
(JSC::JSWebAssemblyInstance::~JSWebAssemblyInstance):
(JSC::JSWebAssemblyInstance::visitChildrenImpl):
(JSC::JSWebAssemblyInstance::allocationSize):
(JSC::JSWebAssemblyInstance::table):
(JSC::JSWebAssemblyInstance::tableCopy):
(JSC::JSWebAssemblyInstance::elementAt const):
(JSC::JSWebAssemblyInstance::evaluateConstantExpression):
(JSC::JSWebAssemblyInstance::tableInit):
(JSC::JSWebAssemblyInstance::setTable):
(JSC::JSWebAssemblyInstance::ensureBaselineData):
* Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h:
Canonical link: https://commits.webkit.org/299870@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes