⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 293746 in webkit


Ignore:
Timestamp:
May 3, 2022, 4:27:42 PM (4 years ago)
Author:
ysuzuki@apple.com
Message:

[JSC] Extend Structure heap size from 1GB to 4GB
​https://bugs.webkit.org/show_bug.cgi?id=240028

Reviewed by Saam Barati.

1GB was much smaller compared to StructureIDTable (which allowed 7GB).
This patch extends 1GB to 4GB, that's maximum limit of the current encoding scheme (we can
extend it further to 64GB if we introduce shift based on alignment, but currently not used).
We use this 4GB on platforms which has enough virtual address space.

  • Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):

  • Source/JavaScriptCore/jit/AssemblyHelpers.cpp:

(JSC::AssemblyHelpers::emitNonNullDecodeStructureID):

  • Source/JavaScriptCore/runtime/JSCConfig.h:

Canonical link: ​https://commits.webkit.org/250234@main

Location:
trunk/Source/JavaScriptCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r293729 r293746  
     12022-05-03  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] Extend Structure heap size from 1GB to 4GB
     4        https://bugs.webkit.org/show_bug.cgi?id=240028
     5
     6        Reviewed by Saam Barati.
     7
     8        1GB was much smaller compared to StructureIDTable (which allowed 7GB).
     9        This patch extends 1GB to 4GB, that's maximum limit of the current encoding scheme (we can
     10        extend it further to 64GB if we introduce shift based on alignment, but currently not used).
     11        We use this 4GB on platforms which has enough virtual address space.
     12
     13        * ftl/FTLLowerDFGToB3.cpp:
     14        (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
     15        * jit/AssemblyHelpers.cpp:
     16        (JSC::AssemblyHelpers::emitNonNullDecodeStructureID):
     17        * runtime/JSCConfig.h:
     18
    1192022-05-03  Philippe Normand  <pnormand@igalia.com> and Pavel Feldman <pavel.feldman@gmail.com> and Yury Semikhatsky <yurys@chromium.org>
    220
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r293714 r293746  
    1486114861    m_jit.load32(JITCompiler::Address(rareDataGPR, FunctionRareData::offsetOfInternalFunctionAllocationProfile() + InternalFunctionAllocationProfile::offsetOfStructureID() - JSFunction::rareDataTag), structureGPR);
    1486214862    slowCases.append(m_jit.branchTest32(CCallHelpers::Zero, structureGPR));
    14863     m_jit.emitNonNullDecodeStructureID(structureGPR, structureGPR);
     14863    m_jit.emitNonNullDecodeZeroExtendedStructureID(structureGPR, structureGPR);
    1486414864    m_jit.move(TrustedImmPtr(node->isInternalPromise() ? JSInternalPromise::info() : JSPromise::info()), scratch1GPR);
    1486514865    slowCases.append(m_jit.branchPtr(CCallHelpers::NotEqual, scratch1GPR, CCallHelpers::Address(structureGPR, Structure::classInfoOffset())));
    … …  
    1491014910    m_jit.load32(JITCompiler::Address(rareDataGPR, FunctionRareData::offsetOfInternalFunctionAllocationProfile() + InternalFunctionAllocationProfile::offsetOfStructureID() - JSFunction::rareDataTag), structureGPR);
    1491114911    slowCases.append(m_jit.branchTest32(CCallHelpers::Zero, structureGPR));
    14912     m_jit.emitNonNullDecodeStructureID(structureGPR, structureGPR);
     14912    m_jit.emitNonNullDecodeZeroExtendedStructureID(structureGPR, structureGPR);
    1491314913    m_jit.move(TrustedImmPtr(JSClass::info()), scratch1GPR);
    1491414914    slowCases.append(m_jit.branchPtr(CCallHelpers::NotEqual, scratch1GPR, CCallHelpers::Address(structureGPR, Structure::classInfoOffset())));
  • trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp

    r293710 r293746  
    2101821018        return m_out.shl(m_out.zeroExtPtr(structureID), m_out.constIntPtr(StructureID::encodeShiftAmount));
    2101921019#else
    21020         LValue maskedStructureID = m_out.bitAnd(structureID, m_out.constInt32(StructureID::structureIDMask));
     21020        LValue maskedStructureID = structureID;
     21021        if constexpr (structureHeapAddressSize < 4 * GB)
     21022            maskedStructureID = m_out.bitAnd(structureID, m_out.constInt32(StructureID::structureIDMask));
    2102121023        return m_out.add(m_out.constIntPtr(g_jscConfig.startOfStructureHeap), m_out.zeroExtPtr(maskedStructureID));
    2102221024#endif
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp

    r293710 r293746  
    404404}
    405405
    406 void AssemblyHelpers::emitNonNullDecodeStructureID(RegisterID source, RegisterID dest)
     406void AssemblyHelpers::emitNonNullDecodeZeroExtendedStructureID(RegisterID source, RegisterID dest)
    407407{
    408408#if ENABLE(STRUCTURE_ID_WITH_SHIFT)
    … …  
    410410#elif CPU(ADDRESS64)
    411411    // This could use BFI on arm64 but that only helps if the start of structure heap is encodable as a mov and not as an immediate in the add so it's probably not super important.
    412     and32(TrustedImm32(StructureID::structureIDMask), source, dest);
    413     add64(TrustedImm64(g_jscConfig.startOfStructureHeap), dest);
     412    if constexpr (structureHeapAddressSize >= 4 * GB) {
     413        ASSERT(structureHeapAddressSize == 4 * GB);
     414        move(source, dest);
     415        add64(TrustedImm64(g_jscConfig.startOfStructureHeap), dest);
     416    } else {
     417        and32(TrustedImm32(StructureID::structureIDMask), source, dest);
     418        add64(TrustedImm64(g_jscConfig.startOfStructureHeap), dest);
     419    }
    414420#else // not CPU(ADDRESS64)
    415421    move(source, dest);
    … …  
    420426{
    421427    load32(MacroAssembler::Address(source, JSCell::structureIDOffset()), dest);
    422     emitNonNullDecodeStructureID(dest, dest);
     428    emitNonNullDecodeZeroExtendedStructureID(dest, dest);
    423429}
    424430
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h

    r293203 r293746  
    16111611    }
    16121612   
    1613     void emitNonNullDecodeStructureID(RegisterID source, RegisterID dest);
     1613    void emitNonNullDecodeZeroExtendedStructureID(RegisterID source, RegisterID dest);
    16141614    void emitLoadStructure(VM&, RegisterID source, RegisterID dest);
    16151615    void emitLoadPrototype(VM&, GPRReg objectGPR, JSValueRegs resultRegs, JumpList& slowPath);
  • trunk/Source/JavaScriptCore/runtime/JSCConfig.h

    r293657 r293746  
    4747constexpr uintptr_t structureHeapAddressSize = 512 * MB;
    4848#else
    49 constexpr uintptr_t structureHeapAddressSize = 1 * GB;
     49constexpr uintptr_t structureHeapAddressSize = 4 * GB;
    5050#endif
    5151
  • trunk/Source/JavaScriptCore/tools/IntegrityInlines.h

    r293710 r293746  
    7979    UNUSED_PARAM(structureID);
    8080#if CPU(ADDRESS64) && !ENABLE(STRUCTURE_ID_WITH_SHIFT)
    81     ASSERT(structureID.bits() <= structureHeapAddressSize + StructureID::nukedStructureIDBit);
     81    ASSERT(static_cast<uintptr_t>(structureID.bits()) <= structureHeapAddressSize + StructureID::nukedStructureIDBit);
    8282#endif
    8383}
Note: See TracChangeset for help on using the changeset viewer.