Changeset 242015 in webkit


Ignore:
Timestamp:
Feb 24, 2019 6:17:35 PM (5 years ago)
Author:
ysuzuki@apple.com
Message:

[JSC] Lazily create sentinel Map and Set buckets
https://bugs.webkit.org/show_bug.cgi?id=194975

Reviewed by Saam Barati.

If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.

  • bytecode/BytecodeIntrinsicRegistry.cpp:

(JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
(JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
(JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):

  • bytecode/BytecodeIntrinsicRegistry.h:
  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::handleIntrinsicCall):

  • dfg/DFGOperations.cpp:
  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):

  • dfg/DFGSpeculativeJIT64.cpp:

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

  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
(JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):

  • runtime/MapConstructor.cpp:

(JSC::mapPrivateFuncMapBucketNext):

  • runtime/SetConstructor.cpp:

(JSC::setPrivateFuncSetBucketNext):

  • runtime/VM.cpp:

(JSC::VM::VM):
(JSC::VM::sentinelSetBucketSlow):
(JSC::VM::sentinelMapBucketSlow):

  • runtime/VM.h:

(JSC::VM::sentinelSetBucket):
(JSC::VM::sentinelMapBucket):

Location:
trunk/Source/JavaScriptCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r242014 r242015  
     12019-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] Lazily create sentinel Map and Set buckets
     4        https://bugs.webkit.org/show_bug.cgi?id=194975
     5
     6        Reviewed by Saam Barati.
     7
     8        If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
     9        This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
     10        them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.
     11
     12        * bytecode/BytecodeIntrinsicRegistry.cpp:
     13        (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
     14        (JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
     15        (JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):
     16        * bytecode/BytecodeIntrinsicRegistry.h:
     17        * dfg/DFGByteCodeParser.cpp:
     18        (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
     19        * dfg/DFGOperations.cpp:
     20        * dfg/DFGSpeculativeJIT.cpp:
     21        (JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):
     22        * dfg/DFGSpeculativeJIT64.cpp:
     23        (JSC::DFG::SpeculativeJIT::compile):
     24        * ftl/FTLLowerDFGToB3.cpp:
     25        (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
     26        (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):
     27        * runtime/MapConstructor.cpp:
     28        (JSC::mapPrivateFuncMapBucketNext):
     29        * runtime/SetConstructor.cpp:
     30        (JSC::setPrivateFuncSetBucketNext):
     31        * runtime/VM.cpp:
     32        (JSC::VM::VM):
     33        (JSC::VM::sentinelSetBucketSlow):
     34        (JSC::VM::sentinelMapBucketSlow):
     35        * runtime/VM.h:
     36        (JSC::VM::sentinelSetBucket):
     37        (JSC::VM::sentinelMapBucket):
     38
    1392019-02-20  Darin Adler  <darin@apple.com>
    240
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp

    r221110 r242015  
    7070    m_promiseStateFulfilled.set(m_vm, jsNumber(static_cast<unsigned>(JSPromise::Status::Fulfilled)));
    7171    m_promiseStateRejected.set(m_vm, jsNumber(static_cast<unsigned>(JSPromise::Status::Rejected)));
    72     m_sentinelMapBucket.set(m_vm, m_vm.sentinelMapBucket.get());
    73     m_sentinelSetBucket.set(m_vm, m_vm.sentinelSetBucket.get());
    7472    m_GeneratorResumeModeNormal.set(m_vm, jsNumber(static_cast<int32_t>(JSGeneratorFunction::GeneratorResumeMode::NormalMode)));
    7573    m_GeneratorResumeModeThrow.set(m_vm, jsNumber(static_cast<int32_t>(JSGeneratorFunction::GeneratorResumeMode::ThrowMode)));
     
    102100        return m_##name.get(); \
    103101    }
    104     JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_CONSTANT_GENERATORS)
     102    JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_SIMPLE_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_CONSTANT_GENERATORS)
    105103#undef JSC_DECLARE_BYTECODE_INTRINSIC_CONSTANT_GENERATORS
     104
     105JSValue BytecodeIntrinsicRegistry::sentinelMapBucketValue(BytecodeGenerator& generator)
     106{
     107    return generator.vm()->sentinelMapBucket();
     108}
     109
     110JSValue BytecodeIntrinsicRegistry::sentinelSetBucketValue(BytecodeGenerator& generator)
     111{
     112    return generator.vm()->sentinelSetBucket();
     113}
    106114
    107115} // namespace JSC
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h

    r239761 r242015  
    6767
    6868#define JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_EACH_NAME(macro) \
     69    JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_SIMPLE_EACH_NAME(macro) \
     70    JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_CUSTOM_EACH_NAME(macro) \
     71
     72#define JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_SIMPLE_EACH_NAME(macro) \
    6973    macro(undefined) \
    7074    macro(Infinity) \
     
    8690    macro(promiseStateFulfilled) \
    8791    macro(promiseStateRejected) \
    88     macro(sentinelMapBucket) \
    89     macro(sentinelSetBucket) \
    9092    macro(GeneratorResumeModeNormal) \
    9193    macro(GeneratorResumeModeThrow) \
     
    101103    macro(AsyncGeneratorSuspendReasonAwait) \
    102104    macro(AsyncGeneratorSuspendReasonNone) \
     105
     106#define JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_CUSTOM_EACH_NAME(macro) \
     107    macro(sentinelMapBucket) \
     108    macro(sentinelSetBucket) \
    103109
    104110class BytecodeIntrinsicRegistry {
     
    121127
    122128#define JSC_DECLARE_BYTECODE_INTRINSIC_CONSTANT_GENERATORS(name) Strong<Unknown> m_##name;
    123     JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_CONSTANT_GENERATORS)
     129    JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_SIMPLE_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_CONSTANT_GENERATORS)
    124130#undef JSC_DECLARE_BYTECODE_INTRINSIC_CONSTANT_GENERATORS
    125131};
  • trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

    r241968 r242015  
    29302930            JSCell* sentinel = nullptr;
    29312931            if (intrinsic == JSMapHasIntrinsic)
    2932                 sentinel = m_vm->sentinelMapBucket.get();
     2932                sentinel = m_vm->sentinelMapBucket();
    29332933            else
    2934                 sentinel = m_vm->sentinelSetBucket.get();
     2934                sentinel = m_vm->sentinelSetBucket();
    29352935
    29362936            FrozenValue* frozenPointer = m_graph.freeze(sentinel);
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r241493 r242015  
    28932893    JSMap::BucketType** bucket = jsCast<JSMap*>(map)->findBucket(exec, JSValue::decode(key), hash);
    28942894    if (!bucket)
    2895         return vm.sentinelMapBucket.get();
     2895        return vm.sentinelMapBucket();
    28962896    return *bucket;
    28972897}
     
    29032903    JSSet::BucketType** bucket = jsCast<JSSet*>(map)->findBucket(exec, JSValue::decode(key), hash);
    29042904    if (!bucket)
    2905         return vm.sentinelSetBucket.get();
     2905        return vm.sentinelSetBucket();
    29062906    return *bucket;
    29072907}
     
    29132913    auto* bucket = jsCast<JSSet*>(set)->addNormalized(exec, JSValue::decode(key), JSValue(), hash);
    29142914    if (!bucket)
    2915         return vm.sentinelSetBucket.get();
     2915        return vm.sentinelSetBucket();
    29162916    return bucket;
    29172917}
     
    29232923    auto* bucket = jsCast<JSMap*>(map)->addNormalized(exec, JSValue::decode(key), JSValue::decode(value), hash);
    29242924    if (!bucket)
    2925         return vm.sentinelMapBucket.get();
     2925        return vm.sentinelMapBucket();
    29262926    return bucket;
    29272927}
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r241228 r242015  
    1179311793    JSCell* sentinel = nullptr;
    1179411794    if (node->bucketOwnerType() == BucketOwnerType::Map)
    11795         sentinel = m_jit.vm()->sentinelMapBucket.get();
     11795        sentinel = m_jit.vm()->sentinelMapBucket();
    1179611796    else {
    1179711797        ASSERT(node->bucketOwnerType() == BucketOwnerType::Set);
    11798         sentinel = m_jit.vm()->sentinelSetBucket.get();
     11798        sentinel = m_jit.vm()->sentinelSetBucket();
    1179911799    }
    1180011800    m_jit.move(TrustedImmPtr::weakPointer(m_jit.graph(), sentinel), resultGPR);
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp

    r241849 r242015  
    42184218        notPresentInTable.link(&m_jit);
    42194219        if (node->child1().useKind() == MapObjectUse)
    4220             m_jit.move(TrustedImmPtr::weakPointer(m_jit.graph(), m_jit.vm()->sentinelMapBucket.get()), resultGPR);
     4220            m_jit.move(TrustedImmPtr::weakPointer(m_jit.graph(), m_jit.vm()->sentinelMapBucket()), resultGPR);
    42214221        else
    4222             m_jit.move(TrustedImmPtr::weakPointer(m_jit.graph(), m_jit.vm()->sentinelSetBucket.get()), resultGPR);
     4222            m_jit.move(TrustedImmPtr::weakPointer(m_jit.graph(), m_jit.vm()->sentinelSetBucket()), resultGPR);
    42234223        done.link(&m_jit);
    42244224        cellResult(resultGPR, node);
  • trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp

    r241849 r242015  
    97459745        ValueFromBlock notPresentResult;
    97469746        if (m_node->child1().useKind() == MapObjectUse)
    9747             notPresentResult = m_out.anchor(weakPointer(vm().sentinelMapBucket.get()));
     9747            notPresentResult = m_out.anchor(weakPointer(vm().sentinelMapBucket()));
    97489748        else if (m_node->child1().useKind() == SetObjectUse)
    9749             notPresentResult = m_out.anchor(weakPointer(vm().sentinelSetBucket.get()));
     9749            notPresentResult = m_out.anchor(weakPointer(vm().sentinelSetBucket()));
    97509750        else
    97519751            RELEASE_ASSERT_NOT_REACHED();
     
    97939793        ValueFromBlock noBucketResult;
    97949794        if (m_node->bucketOwnerType() == BucketOwnerType::Map)
    9795             noBucketResult = m_out.anchor(weakPointer(vm().sentinelMapBucket.get()));
     9795            noBucketResult = m_out.anchor(weakPointer(vm().sentinelMapBucket()));
    97969796        else {
    97979797            ASSERT(m_node->bucketOwnerType() == BucketOwnerType::Set);
    9798             noBucketResult = m_out.anchor(weakPointer(vm().sentinelSetBucket.get()));
     9798            noBucketResult = m_out.anchor(weakPointer(vm().sentinelSetBucket()));
    97999799        }
    98009800        m_out.jump(continuation);
  • trunk/Source/JavaScriptCore/runtime/MapConstructor.cpp

    r236697 r242015  
    137137        bucket = bucket->next();
    138138    }
    139     return JSValue::encode(exec->vm().sentinelMapBucket.get());
     139    return JSValue::encode(exec->vm().sentinelMapBucket());
    140140}
    141141
  • trunk/Source/JavaScriptCore/runtime/SetConstructor.cpp

    r236697 r242015  
    123123        bucket = bucket->next();
    124124    }
    125     return JSValue::encode(exec->vm().sentinelSetBucket.get());
     125    return JSValue::encode(exec->vm().sentinelSetBucket());
    126126}
    127127
  • trunk/Source/JavaScriptCore/runtime/VM.cpp

    r241955 r242015  
    402402    executableToCodeBlockEdgeStructure.set(*this, ExecutableToCodeBlockEdge::createStructure(*this, nullptr, jsNull()));
    403403
    404     sentinelSetBucket.set(*this, JSSet::BucketType::createSentinel(*this));
    405     sentinelMapBucket.set(*this, JSMap::BucketType::createSentinel(*this));
     404    // Eagerly initialize constant cells since the concurrent compiler can access them.
     405    if (canUseJIT()) {
     406        sentinelMapBucket();
     407        sentinelSetBucket();
     408    }
    406409
    407410    Thread::current().setCurrentAtomicStringTable(existingEntryAtomicStringTable);
     
    12851288#undef DYNAMIC_SPACE_AND_SET_DEFINE_MEMBER_SLOW
    12861289
     1290
     1291JSCell* VM::sentinelSetBucketSlow()
     1292{
     1293    ASSERT(!m_sentinelSetBucket);
     1294    auto* sentinel = JSSet::BucketType::createSentinel(*this);
     1295    m_sentinelSetBucket.set(*this, sentinel);
     1296    return sentinel;
     1297}
     1298
     1299JSCell* VM::sentinelMapBucketSlow()
     1300{
     1301    ASSERT(!m_sentinelMapBucket);
     1302    auto* sentinel = JSMap::BucketType::createSentinel(*this);
     1303    m_sentinelMapBucket.set(*this, sentinel);
     1304    return sentinel;
     1305}
     1306
    12871307JSGlobalObject* VM::vmEntryGlobalObject(const CallFrame* callFrame) const
    12881308{
  • trunk/Source/JavaScriptCore/runtime/VM.h

    r241582 r242015  
    540540
    541541    Strong<JSCell> emptyPropertyNameEnumerator;
    542     Strong<JSCell> sentinelSetBucket;
    543     Strong<JSCell> sentinelMapBucket;
     542
     543    Strong<JSCell> m_sentinelSetBucket;
     544    Strong<JSCell> m_sentinelMapBucket;
    544545
    545546    std::unique_ptr<PromiseDeferredTimer> promiseDeferredTimer;
     
    563564    WTF::SymbolRegistry& symbolRegistry() { return m_symbolRegistry; }
    564565
     566    JSCell* sentinelSetBucket()
     567    {
     568        if (LIKELY(m_sentinelSetBucket))
     569            return m_sentinelSetBucket.get();
     570        return sentinelSetBucketSlow();
     571    }
     572
     573    JSCell* sentinelMapBucket()
     574    {
     575        if (LIKELY(m_sentinelMapBucket))
     576            return m_sentinelMapBucket.get();
     577        return sentinelMapBucketSlow();
     578    }
     579
    565580    WeakGCMap<SymbolImpl*, Symbol, PtrHash<SymbolImpl*>> symbolImplToSymbolMap;
    566581
     
    890905    static VM*& sharedInstanceInternal();
    891906    void createNativeThunk();
     907
     908    JSCell* sentinelSetBucketSlow();
     909    JSCell* sentinelMapBucketSlow();
    892910
    893911    void updateStackLimits();
Note: See TracChangeset for help on using the changeset viewer.