[webkit-changes] [WebKit/WebKit] 32a1d5: [JSC] Track active replacement WatchpointSets as a...

Yusuke Suzuki noreply at github.com
Wed May 10 12:46:41 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 32a1d510d466fba92cfd5b32bc6ca266af206431
      https://github.com/WebKit/WebKit/commit/32a1d510d466fba92cfd5b32bc6ca266af206431
  Author: Yusuke Suzuki <ysuzuki at apple.com>
  Date:   2023-05-10 (Wed, 10 May 2023)

  Changed paths:
    M Source/JavaScriptCore/bytecode/PropertyCondition.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
    M Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
    M Source/JavaScriptCore/jit/JITPropertyAccess.cpp
    M Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
    M Source/JavaScriptCore/runtime/CommonSlowPathsInlines.h
    M Source/JavaScriptCore/runtime/Structure.cpp
    M Source/JavaScriptCore/runtime/Structure.h
    M Source/JavaScriptCore/runtime/StructureInlines.h
    M Source/JavaScriptCore/runtime/StructureRareData.h

  Log Message:
  -----------
  [JSC] Track active replacement WatchpointSets as a preparation for megamorphic store cache
https://bugs.webkit.org/show_bug.cgi?id=256568
rdar://109129404

Reviewed by Justin Michaud.

When integrating megamorphic store cache, we would like to make it work only for very simple Structures, which
do not need to consider about replacement WatchpointSet firing. This means that Structure should know whether
it has active (not invalidated) replacement WatchpointSet quickly. Previously we have didWatchReplacement bit,
but it turned out that this becomes true so frequently because any kind of replacement IC will insert *already-invalidated*
WatchpointSet for this Structure to keep this property replacement not firing WatchpointSet.

So, let's track actual active # of replacement WatchpointSets and flip a bit of Structure. We rename didWatchReplacement
to isWatchingReplacement bit, which tells whether a Structure is *right now* watching replacement. We track # of replacement
WatchpointSets, and flip this bit based on this. These work should be done in the main thread, and this invariant is kept well
since replacement Watchpoint creation and firing only happen in the main thread.

* Source/JavaScriptCore/bytecode/PropertyCondition.cpp:
(JSC::PropertyCondition::isWatchableWhenValid const):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compileEnumeratorPutByVal):
* Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
* Source/JavaScriptCore/jit/JITPropertyAccess.cpp:
(JSC::JIT::emit_op_enumerator_put_by_val):
* Source/JavaScriptCore/llint/LowLevelInterpreter64.asm:
* Source/JavaScriptCore/runtime/CommonSlowPathsInlines.h:
(JSC::CommonSlowPaths::opEnumeratorPutByVal):
* Source/JavaScriptCore/runtime/Structure.cpp:
(JSC::Structure::ensurePropertyReplacementWatchpointSet):
(JSC::Structure::firePropertyReplacementWatchpointSet):
(JSC::Structure::didCachePropertyReplacement):
* Source/JavaScriptCore/runtime/Structure.h:
* Source/JavaScriptCore/runtime/StructureInlines.h:
(JSC::Structure::didReplaceProperty):
* Source/JavaScriptCore/runtime/StructureRareData.h:

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




More information about the webkit-changes mailing list