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

Changeset 277475 in webkit


Ignore:
Timestamp:
May 13, 2021, 7:03:43 PM (5 years ago)
Author:
ggaren@apple.com
Message:

m_calleeSaveRegisters should not be a pointer to a pointer
​https://bugs.webkit.org/show_bug.cgi?id=225787

Reviewed by Keith Miller.

Ben found this through memory stress testing.

RegisterAtOffsetList is effectively just a pointer. unique_ptr<RegisterAtOffsetList>
is a pointer to a pointer. RegisterAtOffsetList is long-lived, so it
creates heap page fragmentation.

Worth 3MB on Ben's test.

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::setCalleeSaveRegisters):
(JSC::CodeBlock::calleeSaveRegisters const): Use a fence before setting
m_hasCalleeSaveRegisters to ensure that all writes have completed before
the struct becomes visible.

  • bytecode/CodeBlock.h: Use RegisterAtOffsetList directly instead of

unique_ptr<RegisterAtOffsetList> to avoid a long-lived lonely 8 byte
allocation.

  • ftl/FTLCompile.cpp:

(JSC::FTL::compile): Updated for type change.

Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r277449 r277475  
     12021-05-13  Geoffrey Garen  <ggaren@apple.com>
     2
     3        m_calleeSaveRegisters should not be a pointer to a pointer
     4        https://bugs.webkit.org/show_bug.cgi?id=225787
     5
     6        Reviewed by Keith Miller.
     7
     8        Ben found this through memory stress testing.
     9
     10        RegisterAtOffsetList is effectively just a pointer. unique_ptr<RegisterAtOffsetList>
     11        is a pointer to a pointer. RegisterAtOffsetList is long-lived, so it
     12        creates heap page fragmentation.
     13
     14        Worth 3MB on Ben's test.
     15
     16        * bytecode/CodeBlock.cpp:
     17        (JSC::CodeBlock::setCalleeSaveRegisters):
     18        (JSC::CodeBlock::calleeSaveRegisters const): Use a fence before setting
     19        m_hasCalleeSaveRegisters to ensure that all writes have completed before
     20        the struct becomes visible.
     21
     22        * bytecode/CodeBlock.h: Use RegisterAtOffsetList directly instead of
     23        unique_ptr<RegisterAtOffsetList> to avoid a long-lived lonely 8 byte
     24        allocation.
     25
     26        * ftl/FTLCompile.cpp:
     27        (JSC::FTL::compile): Updated for type change.
     28
    1292021-05-13  Chris Dumez  <cdumez@apple.com>
    230
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp

    r276655 r277475  
    17911791}
    17921792
    1793 void CodeBlock::setCalleeSaveRegisters(RegisterSet calleeSaveRegisters)
    1794 {
     1793void CodeBlock::setCalleeSaveRegisters(RegisterSet registerSet)
     1794{
     1795    auto calleeSaveRegisters = RegisterAtOffsetList(registerSet);
     1796
    17951797    ConcurrentJSLocker locker(m_lock);
    1796     ensureJITData(locker).m_calleeSaveRegisters = makeUnique<RegisterAtOffsetList>(calleeSaveRegisters);
    1797 }
    1798 
    1799 void CodeBlock::setCalleeSaveRegisters(std::unique_ptr<RegisterAtOffsetList> registerAtOffsetList)
     1798    auto& jitData = ensureJITData(locker);
     1799    jitData.m_calleeSaveRegisters = WTFMove(calleeSaveRegisters);
     1800    WTF::storeStoreFence();
     1801    jitData.m_hasCalleeSaveRegisters = true;
     1802}
     1803
     1804void CodeBlock::setCalleeSaveRegisters(RegisterAtOffsetList&& registerAtOffsetList)
    18001805{
    18011806    ConcurrentJSLocker locker(m_lock);
    1802     ensureJITData(locker).m_calleeSaveRegisters = WTFMove(registerAtOffsetList);
     1807    auto& jitData = ensureJITData(locker);
     1808    jitData.m_calleeSaveRegisters = WTFMove(registerAtOffsetList);
     1809    WTF::storeStoreFence();
     1810    jitData.m_hasCalleeSaveRegisters = true;
    18031811}
    18041812
    … …  
    24932501#if ENABLE(JIT)
    24942502    if (auto* jitData = m_jitData.get()) {
    2495         if (const RegisterAtOffsetList* registers = jitData->m_calleeSaveRegisters.get())
    2496             return registers;
     2503        if (jitData->m_hasCalleeSaveRegisters)
     2504            return &jitData->m_calleeSaveRegisters;
    24972505    }
    24982506#endif
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.h

    r277383 r277475  
    6565#include "ProgramExecutable.h"
    6666#include "PutPropertySlot.h"
     67#include "RegisterAtOffsetList.h"
    6768#include "ValueProfile.h"
    6869#include "VirtualRegister.h"
    … …  
    284285        FixedVector<StringJumpTable> m_stringSwitchJumpTables;
    285286        std::unique_ptr<PCToCodeOriginMap> m_pcToCodeOriginMap;
    286         std::unique_ptr<RegisterAtOffsetList> m_calleeSaveRegisters;
     287        bool m_hasCalleeSaveRegisters { false };
     288        RegisterAtOffsetList m_calleeSaveRegisters;
    287289        JITCodeMap m_jitCodeMap;
    288290    };
    … …  
    344346
    345347    void setCalleeSaveRegisters(RegisterSet);
    346     void setCalleeSaveRegisters(std::unique_ptr<RegisterAtOffsetList>);
     348    void setCalleeSaveRegisters(RegisterAtOffsetList&&);
    347349
    348350    void setRareCaseProfiles(FixedVector<RareCaseProfile>&&);
  • trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp

    r277383 r277475  
    7272        return;
    7373   
    74     std::unique_ptr<RegisterAtOffsetList> registerOffsets =
    75         makeUnique<RegisterAtOffsetList>(state.proc->calleeSaveRegisterAtOffsetList());
     74    RegisterAtOffsetList registerOffsets = state.proc->calleeSaveRegisterAtOffsetList();
    7675    if (shouldDumpDisassembly())
    77         dataLog(tierName, "Unwind info for ", CodeBlockWithJITType(codeBlock, JITType::FTLJIT), ": ", *registerOffsets, "\n");
     76        dataLog(tierName, "Unwind info for ", CodeBlockWithJITType(codeBlock, JITType::FTLJIT), ": ", registerOffsets, "\n");
    7877    codeBlock->setCalleeSaveRegisters(WTFMove(registerOffsets));
    7978    ASSERT(!(state.proc->frameSize() % sizeof(EncodedJSValue)));
Note: See TracChangeset for help on using the changeset viewer.