Ignore:
Timestamp:
Aug 26, 2021, 9:26:35 PM (4 years ago)
Author:
[email protected]
Message:

[JSC] op_put_private_name should use modern IC and remove ByValInfo
https://bugs.webkit.org/show_bug.cgi?id=229544

Reviewed by Saam Barati.

JSTests:

Move class-fields-private benchmarks into microbenchmarks.
Added several microbenchmarks and stress tests.

  • microbenchmarks/class-private-field-polymorphic.js: Added.

(shouldBe):
(test.A.prototype.put):

  • microbenchmarks/get-private-name.js: Renamed from JSTests/microbenchmarks/class-fields-private/get-private-name.js.
  • microbenchmarks/monomorphic-get-private-field.js: Renamed from JSTests/microbenchmarks/class-fields-private/monomorphic-get-private-field.js.
  • microbenchmarks/polymorphic-get-private-field.js: Renamed from JSTests/microbenchmarks/class-fields-private/polymorphic-get-private-field.js.
  • microbenchmarks/polymorphic-put-private-field.js: Renamed from JSTests/microbenchmarks/class-fields-private/polymorphic-put-private-field.js.
  • microbenchmarks/put-by-val-polymorphic-properties.js: Added.

(shouldBe):
(test):

  • microbenchmarks/put-private-field.js: Renamed from JSTests/microbenchmarks/class-fields-private/put-private-field.js.
  • stress/class-private-field-megamorphic.js: Added.

(shouldBe):

  • stress/class-private-field-polymorphic.js: Added.

(shouldBe):
(test.A.prototype.put):

  • stress/put-by-val-polymorphic-properties.js: Added.

(shouldBe):
(test):

Source/JavaScriptCore:

This patch makes op_put_private_name use new PutByVal IC. This allows op_put_private_name to support
polymorphic properties, and we can finally remove Baseline's adhoc IC and ByValInfo completely.

Added microbenchmark showed 3x improvement due to polymorphic PutPrivateName IC.

ToT Patched

class-private-field-polymorphic 9.3666+-0.0332 3.1199+-0.0182 definitely 3.0022x faster

  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Sources.txt:
  • bytecode/ByValInfo.cpp: Removed.
  • bytecode/ByValInfo.h: Removed.
  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::getICStatusMap):
(JSC::CodeBlock::stronglyVisitStrongReferences):
(JSC::CodeBlock::findByValInfo): Deleted.
(JSC::CodeBlock::addByValInfo): Deleted.

  • bytecode/CodeBlock.h:
  • bytecode/ICStatusMap.h:
  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::parseBlock):

  • dfg/DFGFixupPhase.cpp:

(JSC::DFG::FixupPhase::fixupNode):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileGetPrivateName):
(JSC::DFG::SpeculativeJIT::compilePutPrivateName):

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGStoreBarrierInsertionPhase.cpp:
  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compilePutPrivateName):

  • jit/JIT.cpp:

(JSC::JIT::privateCompileSlowCases):
(JSC::JIT::link):
(JSC::JIT::privateCompileExceptionHandlers):

  • jit/JIT.h:

(JSC::ByValCompilationInfo::ByValCompilationInfo): Deleted.

  • jit/JITInlines.h:

(JSC::JIT::emitArrayProfileStoreToHoleSpecialCase): Deleted.
(JSC::JIT::emitArrayProfileOutOfBoundsSpecialCase): Deleted.

  • jit/JITOperations.cpp:

(JSC::putPrivateNameOptimize):
(JSC::putPrivateName):
(JSC::JSC_DEFINE_JIT_OPERATION):

  • jit/JITOperations.h:
  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_put_private_name):
(JSC::JIT::emitSlow_op_put_private_name):
(JSC::JIT::slow_op_put_private_name_prepareCallGenerator):
(JSC::JIT::emitPutByValWithCachedId): Deleted.
(JSC::JIT::emitPutPrivateNameWithCachedId): Deleted.
(JSC::JIT::emitByValIdentifierCheck): Deleted.
(JSC::JIT::privateCompilePutPrivateNameWithCachedId): Deleted.

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_put_private_name):
(JSC::JIT::emitSlow_op_put_private_name):

  • jit/Repatch.cpp:

(JSC::appropriateGenericPutByFunction):
(JSC::appropriateOptimizingPutByFunction):
(JSC::resetPutBy):

Tools:

  • Scripts/run-jsc-benchmarks:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp

    r280760 r281684  
    3333#include "ArithProfile.h"
    3434#include "BasicBlockLocation.h"
    35 #include "ByValInfo.h"
    3635#include "BytecodeDumper.h"
    3736#include "BytecodeLivenessAnalysisInlines.h"
     
    16271626            for (CallLinkInfo* callLinkInfo : jitData->m_callLinkInfos)
    16281627                result.add(callLinkInfo->codeOrigin(), ICStatus()).iterator->value.callLinkInfo = callLinkInfo;
    1629             for (ByValInfo* byValInfo : jitData->m_byValInfos)
    1630                 result.add(CodeOrigin(byValInfo->bytecodeIndex), ICStatus()).iterator->value.byValInfo = byValInfo;
    16311628        }
    16321629#if ENABLE(DFG_JIT)
     
    17001697}
    17011698
    1702 ByValInfo* CodeBlock::findByValInfo(CodeOrigin codeOrigin)
    1703 {
    1704     ConcurrentJSLocker locker(m_lock);
    1705     if (auto* jitData = m_jitData.get()) {
    1706         for (ByValInfo* byValInfo : jitData->m_byValInfos) {
    1707             if (byValInfo->bytecodeIndex == codeOrigin.bytecodeIndex())
    1708                 return byValInfo;
    1709         }
    1710     }
    1711     return nullptr;
    1712 }
    1713 
    1714 ByValInfo* CodeBlock::addByValInfo(BytecodeIndex bytecodeIndex)
    1715 {
    1716     ConcurrentJSLocker locker(m_lock);
    1717     return ensureJITData(locker).m_byValInfos.add(bytecodeIndex);
    1718 }
    1719 
    17201699CallLinkInfo* CodeBlock::addCallLinkInfo(CodeOrigin codeOrigin)
    17211700{
     
    18291808#if ENABLE(JIT)
    18301809    if (auto* jitData = m_jitData.get()) {
    1831         for (ByValInfo* byValInfo : jitData->m_byValInfos)
    1832             byValInfo->visitAggregate(visitor);
    18331810        for (StructureStubInfo* stubInfo : jitData->m_stubInfos)
    18341811            stubInfo->visitAggregate(visitor);
Note: See TracChangeset for help on using the changeset viewer.