Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: b451fca37277a0b56042695981ba0efda1795d80
      
https://github.com/WebKit/WebKit/commit/b451fca37277a0b56042695981ba0efda1795d80
  Author: Yijia Huang <yijia_hu...@apple.com>
  Date:   2024-07-08 (Mon, 08 Jul 2024)

  Changed paths:
    A JSTests/microbenchmarks/js-map-get-int-no-dfg-no-inline.js
    A JSTests/microbenchmarks/js-map-get-int.js
    A JSTests/microbenchmarks/js-map-get-string-no-dfg-no-inline.js
    A JSTests/microbenchmarks/js-map-get-string.js
    A JSTests/microbenchmarks/js-map-set-int-no-dfg-no-inline.js
    A JSTests/microbenchmarks/js-map-set-int.js
    A JSTests/microbenchmarks/js-map-set-string-no-dfg-no-inline.js
    A JSTests/microbenchmarks/js-map-set-string.js
    A JSTests/stress/map-iterators-next-2.js
    A JSTests/stress/set-iterators-next-2.js
    M Source/JavaScriptCore/CMakeLists.txt
    M Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
    M Source/JavaScriptCore/Sources.txt
    M Source/JavaScriptCore/builtins/BuiltinNames.h
    M Source/JavaScriptCore/builtins/MapIteratorPrototype.js
    M Source/JavaScriptCore/builtins/MapPrototype.js
    M Source/JavaScriptCore/builtins/SetIteratorPrototype.js
    M Source/JavaScriptCore/builtins/SetPrototype.js
    M Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp
    M Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h
    M Source/JavaScriptCore/bytecode/LinkTimeConstant.h
    M Source/JavaScriptCore/bytecode/SpeculatedType.cpp
    M Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
    M Source/JavaScriptCore/dfg/DFGAbstractHeap.h
    M Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
    M Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
    M Source/JavaScriptCore/dfg/DFGClobberize.h
    M Source/JavaScriptCore/dfg/DFGDoesGC.cpp
    M Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
    M Source/JavaScriptCore/dfg/DFGHeapLocation.cpp
    M Source/JavaScriptCore/dfg/DFGHeapLocation.h
    M Source/JavaScriptCore/dfg/DFGNode.h
    M Source/JavaScriptCore/dfg/DFGNodeType.h
    M Source/JavaScriptCore/dfg/DFGOperations.cpp
    M Source/JavaScriptCore/dfg/DFGOperations.h
    M Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
    M Source/JavaScriptCore/dfg/DFGSafeToExecute.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
    M Source/JavaScriptCore/dfg/DFGUseKind.cpp
    M Source/JavaScriptCore/dfg/DFGUseKind.h
    M Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h
    M Source/JavaScriptCore/ftl/FTLCapabilities.cpp
    M Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
    M Source/JavaScriptCore/heap/Heap.h
    M Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp
    A Source/JavaScriptCore/runtime/HashMapHelper.h
    R Source/JavaScriptCore/runtime/HashMapImpl.cpp
    R Source/JavaScriptCore/runtime/HashMapImpl.h
    R Source/JavaScriptCore/runtime/HashMapImplInlines.h
    M Source/JavaScriptCore/runtime/Intrinsic.h
    M Source/JavaScriptCore/runtime/JSCJSValue.h
    M Source/JavaScriptCore/runtime/JSGlobalObject.cpp
    M Source/JavaScriptCore/runtime/JSGlobalObjectInlines.h
    M Source/JavaScriptCore/runtime/JSImmutableButterfly.h
    M Source/JavaScriptCore/runtime/JSMap.h
    M Source/JavaScriptCore/runtime/JSMapInlines.h
    M Source/JavaScriptCore/runtime/JSMapIterator.cpp
    M Source/JavaScriptCore/runtime/JSMapIterator.h
    M Source/JavaScriptCore/runtime/JSSet.h
    M Source/JavaScriptCore/runtime/JSSetInlines.h
    M Source/JavaScriptCore/runtime/JSSetIterator.cpp
    M Source/JavaScriptCore/runtime/JSSetIterator.h
    M Source/JavaScriptCore/runtime/MapConstructor.cpp
    M Source/JavaScriptCore/runtime/MapConstructor.h
    M Source/JavaScriptCore/runtime/MapPrototype.cpp
    A Source/JavaScriptCore/runtime/OrderedHashTable.cpp
    A Source/JavaScriptCore/runtime/OrderedHashTable.h
    A Source/JavaScriptCore/runtime/OrderedHashTableHelper.h
    M Source/JavaScriptCore/runtime/SetConstructor.cpp
    M Source/JavaScriptCore/runtime/SetConstructor.h
    M Source/JavaScriptCore/runtime/SetPrototype.cpp
    M Source/JavaScriptCore/runtime/VM.cpp
    M Source/JavaScriptCore/runtime/VM.h
    M Source/JavaScriptCore/runtime/WeakMapImpl.h
    M Source/JavaScriptCore/runtime/WeakMapImplInlines.h
    M Source/JavaScriptCore/runtime/WeakSetPrototype.cpp
    M Source/WebCore/bindings/js/JSDOMMapLike.cpp
    M Source/WebCore/bindings/js/SerializedScriptValue.cpp

  Log Message:
  -----------
  [JSC] Refine JSMap and JSSet with CloseTable
https://bugs.webkit.org/show_bug.cgi?id=274415
rdar://120931591

Reviewed by Yusuke Suzuki.

This patch enhances the implementation of JSMap and JSSet by replacing
the existing storage mechanism (HashMapImpl<HashMapBucket<Data>>) with
an OrderedHashTable. The new OrderedHashTable flattens the CloseTable[1]
structure into a single array, optimizing memory usage and improving
cache locality.

Microbenchmark results with 20 iterations:

                                                without                     with

js-map-set-int                            0.5624+-0.0070     ^      
0.4446+-0.0069        ^ definitely 1.2651x faster
js-map-get-string-no-dfg-no-inline        5.3237+-0.0117     ^      
5.1858+-0.0176        ^ definitely 1.0266x faster
js-map-get-int                            1.3820+-0.0118     ^      
1.2287+-0.0127        ^ definitely 1.1247x faster
js-map-set-int-no-dfg-no-inline           0.6037+-0.0069     ^      
0.4741+-0.0073        ^ definitely 1.2734x faster
js-map-get-string                         1.7580+-0.0118     ^      
1.6399+-0.0158        ^ definitely 1.0721x faster
js-map-set-string-no-dfg-no-inline        0.8514+-0.0087     ^      
0.7264+-0.0080        ^ definitely 1.1722x faster
js-map-get-int-no-dfg-no-inline           3.3643+-0.0109     ^      
3.2791+-0.0116        ^ definitely 1.0260x faster
js-map-set-string                         0.8092+-0.0092     ^      
0.6811+-0.0091        ^ definitely 1.1881x faster

<geometric>                               1.3356+-0.0070     ^      
1.1714+-0.0075        ^ definitely 1.1402x faster

[1] https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables

* JSTests/microbenchmarks/js-map-get-int-no-dfg-no-inline.js: Added.
(testSet):
(testGet):
* JSTests/microbenchmarks/js-map-get-int.js: Added.
(testSet):
(testGet):
* JSTests/microbenchmarks/js-map-get-string-no-dfg-no-inline.js: Added.
(testSet):
(testGet):
* JSTests/microbenchmarks/js-map-get-string.js: Added.
(testSet):
(testGet):
* JSTests/microbenchmarks/js-map-set-int-no-dfg-no-inline.js: Added.
(testSet):
* JSTests/microbenchmarks/js-map-set-int.js: Added.
(testSet):
* JSTests/microbenchmarks/js-map-set-string-no-dfg-no-inline.js: Added.
(testSet):
* JSTests/microbenchmarks/js-map-set-string.js: Added.
(testSet):
* JSTests/stress/map-iterators-next-2.js: Added.
(assert):
* JSTests/stress/set-iterators-next-2.js: Added.
(assert):
* Source/JavaScriptCore/CMakeLists.txt:
* Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:
* Source/JavaScriptCore/Sources.txt:
* Source/JavaScriptCore/builtins/BuiltinNames.h:
* Source/JavaScriptCore/builtins/MapIteratorPrototype.js:
(next):
(linkTimeConstant.mapIteratorNext): Deleted.
* Source/JavaScriptCore/builtins/MapPrototype.js:
(forEach):
* Source/JavaScriptCore/builtins/SetIteratorPrototype.js:
(next):
(linkTimeConstant.setIteratorNext): Deleted.
* Source/JavaScriptCore/builtins/SetPrototype.js:
(forEach):
(isSubsetOf):
* Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp:
(JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
(JSC::BytecodeIntrinsicRegistry::orderedHashTableSentinelValue):
(JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue): Deleted.
(JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue): Deleted.
* Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h:
* Source/JavaScriptCore/bytecode/LinkTimeConstant.h:
* Source/JavaScriptCore/bytecode/SpeculatedType.cpp:
(JSC::speculationFromClassInfoInheritance):
* Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:
(JSC::mapIteratorInternalFieldIndex):
(JSC::setIteratorInternalFieldIndex):
* Source/JavaScriptCore/dfg/DFGAbstractHeap.h:
* Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:
(JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleIntrinsicCall):
* Source/JavaScriptCore/dfg/DFGClobberize.h:
(JSC::DFG::clobberize):
* Source/JavaScriptCore/dfg/DFGDoesGC.cpp:
(JSC::DFG::doesGC):
* Source/JavaScriptCore/dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
* Source/JavaScriptCore/dfg/DFGHeapLocation.cpp:
(WTF::printInternal):
* Source/JavaScriptCore/dfg/DFGHeapLocation.h:
* Source/JavaScriptCore/dfg/DFGNode.h:
(JSC::DFG::Node::hasHeapPrediction):
(JSC::DFG::Node::hasBucketOwnerType):
* Source/JavaScriptCore/dfg/DFGNodeType.h:
* Source/JavaScriptCore/dfg/DFGOperations.cpp:
(JSC::DFG::JSC_DEFINE_JIT_OPERATION):
* Source/JavaScriptCore/dfg/DFGOperations.h:
* Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp:
* Source/JavaScriptCore/dfg/DFGSafeToExecute.h:
(JSC::DFG::SafeToExecuteEdge::operator()):
(JSC::DFG::safeToExecute):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compileGetMapIndexImpl):
(JSC::DFG::SpeculativeJIT::compileMapKeyIndex):
(JSC::DFG::SpeculativeJIT::compileMapValue):
(JSC::DFG::SpeculativeJIT::compile):
* Source/JavaScriptCore/dfg/DFGUseKind.cpp:
(WTF::printInternal):
* Source/JavaScriptCore/dfg/DFGUseKind.h:
(JSC::DFG::typeFilterFor):
(JSC::DFG::isCell):
* Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h:
* Source/JavaScriptCore/ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileNode):
(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
* Source/JavaScriptCore/heap/Heap.h:
* Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp:
(Inspector::cloneMapIteratorObject):
(Inspector::cloneSetIteratorObject):
(Inspector::JSInjectedScriptHost::iteratorEntries):
* Source/JavaScriptCore/runtime/HashMapHelper.h: Added.
(JSC::areKeysEqual):
(JSC::normalizeMapKey):
(JSC::wangsInt64Hash):
(JSC::jsMapHash):
(JSC::jsMapHashImpl):
(JSC::jsMapHashForAlreadyHashedValue):
(JSC::concurrentJSMapHash):
(JSC::shouldShrink):
(JSC::shouldRehash):
(JSC::nextCapacity):
* Source/JavaScriptCore/runtime/HashMapImpl.cpp: Removed.
* Source/JavaScriptCore/runtime/HashMapImpl.h: Removed.
* Source/JavaScriptCore/runtime/HashMapImplInlines.h: Removed.
* Source/JavaScriptCore/runtime/Intrinsic.h:
* Source/JavaScriptCore/runtime/JSCJSValue.h:
(JSC::OrderedHashTableTraits::set):
(JSC::OrderedHashTableTraits::increment):
(JSC::OrderedHashTableTraits::decrement):
* Source/JavaScriptCore/runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::init):
* Source/JavaScriptCore/runtime/JSGlobalObjectInlines.h:
(JSC::createTuple):
* Source/JavaScriptCore/runtime/JSImmutableButterfly.h:
* Source/JavaScriptCore/runtime/JSMap.h:
* Source/JavaScriptCore/runtime/JSMapInlines.h:
* Source/JavaScriptCore/runtime/JSMapIterator.cpp:
(JSC::JSMapIterator::finishCreation):
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::JSMapIterator::createPair): Deleted.
* Source/JavaScriptCore/runtime/JSMapIterator.h:
* Source/JavaScriptCore/runtime/JSSet.h:
* Source/JavaScriptCore/runtime/JSSetInlines.h:
* Source/JavaScriptCore/runtime/JSSetIterator.cpp:
(JSC::JSSetIterator::finishCreation):
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::JSSetIterator::createPair): Deleted.
* Source/JavaScriptCore/runtime/JSSetIterator.h:
* Source/JavaScriptCore/runtime/MapConstructor.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/MapConstructor.h:
* Source/JavaScriptCore/runtime/MapPrototype.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::createMapIteratorObject):
* Source/JavaScriptCore/runtime/OrderedHashTable.cpp: Copied from 
Source/JavaScriptCore/runtime/JSMapInlines.h.
(JSC::OrderedHashTable<Traits>::visitChildrenImpl):
* Source/JavaScriptCore/runtime/OrderedHashTable.h: Added.
(JSC::OrderedHashTable::OrderedHashTable):
(JSC::OrderedHashTable::offsetOfButterfly):
(JSC::OrderedHashTable::finishCreation):
(JSC::OrderedHashTable::getKeyIndex):
(JSC::OrderedHashTable::has):
(JSC::OrderedHashTable::add):
(JSC::OrderedHashTable::addNormalized):
(JSC::OrderedHashTable::remove):
(JSC::OrderedHashTable::removeNormalized):
(JSC::OrderedHashTable::size):
(JSC::OrderedHashTable::clear):
(JSC::OrderedHashTable::materializeIfNeeded):
(JSC::OrderedHashTable::storageOrSentinel):
(JSC::OrderedHashTable::storageRef):
(JSC::OrderedHashMap::OrderedHashMap):
(JSC::OrderedHashMap::getImpl):
(JSC::OrderedHashMap::get):
(JSC::OrderedHashMap::createSentinel):
(JSC::OrderedHashMap::createDeletedValue):
(JSC::OrderedHashSet::OrderedHashSet):
* Source/JavaScriptCore/runtime/OrderedHashTableHelper.h: Added.
(JSC::OrderedHashTableHelper::toNumber):
(JSC::OrderedHashTableHelper::asNumber):
(JSC::OrderedHashTableHelper::toJSValue):
(JSC::OrderedHashTableHelper::isDeleted):
(JSC::OrderedHashTableHelper::isValidTableIndex):
(JSC::OrderedHashTableHelper::invalidTableIndex):
(JSC::OrderedHashTableHelper::get):
(JSC::OrderedHashTableHelper::slot):
(JSC::OrderedHashTableHelper::set):
(JSC::OrderedHashTableHelper::setWithWriteBarrier):
(JSC::OrderedHashTableHelper::aliveEntryCountIndex):
(JSC::OrderedHashTableHelper::deletedEntryCountIndex):
(JSC::OrderedHashTableHelper::capacityIndex):
(JSC::OrderedHashTableHelper::iterationEntryIndex):
(JSC::OrderedHashTableHelper::aliveEntryCount):
(JSC::OrderedHashTableHelper::deletedEntryCount):
(JSC::OrderedHashTableHelper::usedCapacity):
(JSC::OrderedHashTableHelper::capacity):
(JSC::OrderedHashTableHelper::iterationEntry):
(JSC::OrderedHashTableHelper::incrementAliveEntryCount):
(JSC::OrderedHashTableHelper::decrementAliveEntryCount):
(JSC::OrderedHashTableHelper::incrementDeletedEntryCount):
(JSC::OrderedHashTableHelper::bucketCount):
(JSC::OrderedHashTableHelper::hashTableStartIndex):
(JSC::OrderedHashTableHelper::hashTableEndIndex):
(JSC::OrderedHashTableHelper::bucketIndex):
(JSC::OrderedHashTableHelper::dataTableSize):
(JSC::OrderedHashTableHelper::dataTableStartIndex):
(JSC::OrderedHashTableHelper::dataTableEndIndex):
(JSC::OrderedHashTableHelper::entryDataStartIndex):
(JSC::OrderedHashTableHelper::setKeyOrValueData):
(JSC::OrderedHashTableHelper::deleteData):
(JSC::OrderedHashTableHelper::addToChain):
(JSC::OrderedHashTableHelper::tableSize):
(JSC::OrderedHashTableHelper::tableSizeSlow):
(JSC::OrderedHashTableHelper::isObsolete):
(JSC::OrderedHashTableHelper::nextTable):
(JSC::OrderedHashTableHelper::setNextTable):
(JSC::OrderedHashTableHelper::deletedEntriesStartIndex):
(JSC::OrderedHashTableHelper::isCleared):
(JSC::OrderedHashTableHelper::setClearedTableSentinel):
(JSC::OrderedHashTableHelper::tryCreate):
(JSC::OrderedHashTableHelper::copyImpl):
(JSC::OrderedHashTableHelper::copy):
(JSC::OrderedHashTableHelper::rehash):
(JSC::OrderedHashTableHelper::clear):
(JSC::OrderedHashTableHelper::find):
(JSC::OrderedHashTableHelper::expandIfNeeded):
(JSC::OrderedHashTableHelper::addImpl):
(JSC::OrderedHashTableHelper::add):
(JSC::OrderedHashTableHelper::addNormalized):
(JSC::OrderedHashTableHelper::shrinkIfNeed):
(JSC::OrderedHashTableHelper::removeImpl):
(JSC::OrderedHashTableHelper::remove):
(JSC::OrderedHashTableHelper::removeNormalized):
(JSC::OrderedHashTableHelper::transit):
(JSC::OrderedHashTableHelper::transitAndNext):
(JSC::OrderedHashTableHelper::getKey):
(JSC::OrderedHashTableHelper::getValue):
(JSC::OrderedHashTableHelper::nextAndUpdateIterationEntry):
(JSC::OrderedHashTableHelper::getIterationEntry):
(JSC::OrderedHashTableHelper::getIterationEntryKey):
(JSC::OrderedHashTableHelper::getIterationEntryValue):
* Source/JavaScriptCore/runtime/SetConstructor.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/SetConstructor.h:
* Source/JavaScriptCore/runtime/SetPrototype.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::createSetIteratorObject):
* Source/JavaScriptCore/runtime/VM.cpp:
(JSC::VM::VM):
(JSC::VM::orderedHashTableDeletedValueSlow):
(JSC::VM::orderedHashTableSentinelSlow):
(JSC::VM::visitAggregateImpl):
(JSC::VM::sentinelSetBucketSlow): Deleted.
(JSC::VM::sentinelMapBucketSlow): Deleted.
* Source/JavaScriptCore/runtime/VM.h:
(JSC::VM::orderedHashTableDeletedValue):
(JSC::VM::orderedHashTableSentinel):
(JSC::VM::sentinelSetBucket): Deleted.
(JSC::VM::sentinelMapBucket): Deleted.
* Source/JavaScriptCore/runtime/WeakMapImpl.h:
* Source/JavaScriptCore/runtime/WeakMapImplInlines.h:
* Source/JavaScriptCore/runtime/WeakSetPrototype.cpp:
* Source/WebCore/bindings/js/JSDOMMapLike.cpp:
* Source/WebCore/bindings/js/SerializedScriptValue.cpp:
(WebCore::CloneSerializer::serialize):

Canonical link: https://commits.webkit.org/280734@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to