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

Changeset 293203 in webkit


Ignore:
Timestamp:
Apr 21, 2022, 5:51:12 PM (4 years ago)
Author:
ysuzuki@apple.com
Message:

[JSC] Remove TempRegisterSet
https://bugs.webkit.org/show_bug.cgi?id=239578

Reviewed by Mark Lam.

We can always use RegisterSet. TempRegisterSet can save several bytes, but we have no code using TempRegisterSet in
heap-allocated classes. So, this does not make sense anymore. Instead of TempRegisterSet, we will consistently use
RegisterSet to pass register info and ScratchRegisterAllocator to manage allocation of temp / scratch registers.

We also remove the copyCalleeSavesToEntryFrameCalleeSavesBuffer function which takes no scratch register. It was
using TempRegisterSet to allocate a scratch register, but the caller of this function was making assumptions on how
TempRegisterSet will allocate that scratch. This is very fragile and dangerous. We should explicitly pass a scratch
register instead in that case.

  • CMakeLists.txt:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Sources.txt:
  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::lower):

  • jit/AssemblyHelpers.cpp:

(JSC::AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer): Deleted.

  • jit/RegisterSet.h:
  • jit/ScratchRegisterAllocator.cpp:

(JSC::ScratchRegisterAllocator::lock):
(JSC::ScratchRegisterAllocator::allocateScratch):
(JSC::ScratchRegisterAllocator::preserveReusedRegistersByPushing):
(JSC::ScratchRegisterAllocator::restoreReusedRegistersByPopping):

  • jit/ScratchRegisterAllocator.h:
  • jit/TempRegisterSet.cpp: Removed.
  • jit/TempRegisterSet.h: Removed.
  • jit/ThunkGenerators.cpp:

(JSC::handleExceptionGenerator):
(JSC::handleExceptionWithCallFrameRollbackGenerator):
(JSC::throwExceptionFromCallSlowPathGenerator):
(JSC::nativeForGenerator):
(JSC::boundFunctionCallGenerator):
(JSC::remoteFunctionCallGenerator):

  • wasm/js/WasmToJS.cpp:

(JSC::Wasm::wasmToJS):

Location:
trunk/Source/JavaScriptCore
Files:
2 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r293176 r293203  
    868868    jit/RegisterMap.h
    869869    jit/RegisterSet.h
     870    jit/ScratchRegisterAllocator.h
    870871    jit/Snippet.h
    871872    jit/SnippetParams.h
     
    874875    jit/SpillRegistersMode.h
    875876    jit/TagRegistersMode.h
    876     jit/TempRegisterSet.h
    877877    jit/ThunkGenerator.h
    878878
  • trunk/Source/JavaScriptCore/ChangeLog

    r293176 r293203  
     12022-04-21  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] Remove TempRegisterSet
     4        https://bugs.webkit.org/show_bug.cgi?id=239578
     5
     6        Reviewed by Mark Lam.
     7
     8        We can always use RegisterSet. TempRegisterSet can save several bytes, but we have no code using TempRegisterSet in
     9        heap-allocated classes. So, this does not make sense anymore. Instead of TempRegisterSet, we will consistently use
     10        RegisterSet to pass register info and ScratchRegisterAllocator to manage allocation of temp / scratch registers.
     11
     12        We also remove the copyCalleeSavesToEntryFrameCalleeSavesBuffer function which takes no scratch register. It was
     13        using TempRegisterSet to allocate a scratch register, but the caller of this function was making assumptions on how
     14        TempRegisterSet will allocate that scratch. This is very fragile and dangerous. We should explicitly pass a scratch
     15        register instead in that case.
     16
     17        * CMakeLists.txt:
     18        * JavaScriptCore.xcodeproj/project.pbxproj:
     19        * Sources.txt:
     20        * ftl/FTLLowerDFGToB3.cpp:
     21        (JSC::FTL::DFG::LowerDFGToB3::lower):
     22        * jit/AssemblyHelpers.cpp:
     23        (JSC::AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer):
     24        * jit/AssemblyHelpers.h:
     25        (JSC::AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer): Deleted.
     26        * jit/RegisterSet.h:
     27        * jit/ScratchRegisterAllocator.cpp:
     28        (JSC::ScratchRegisterAllocator::lock):
     29        (JSC::ScratchRegisterAllocator::allocateScratch):
     30        (JSC::ScratchRegisterAllocator::preserveReusedRegistersByPushing):
     31        (JSC::ScratchRegisterAllocator::restoreReusedRegistersByPopping):
     32        * jit/ScratchRegisterAllocator.h:
     33        * jit/TempRegisterSet.cpp: Removed.
     34        * jit/TempRegisterSet.h: Removed.
     35        * jit/ThunkGenerators.cpp:
     36        (JSC::handleExceptionGenerator):
     37        (JSC::handleExceptionWithCallFrameRollbackGenerator):
     38        (JSC::throwExceptionFromCallSlowPathGenerator):
     39        (JSC::nativeForGenerator):
     40        (JSC::boundFunctionCallGenerator):
     41        (JSC::remoteFunctionCallGenerator):
     42        * wasm/js/WasmToJS.cpp:
     43        (JSC::Wasm::wasmToJS):
     44
    1452022-04-21  Commit Queue  <commit-queue@webkit.org>
    246
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r293176 r293203  
    187187                0F24E54417EA9F5900ABB217 /* GPRInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E53F17EA9F5900ABB217 /* GPRInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
    188188                0F24E54D17EE274900ABB217 /* JITOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54617EE274900ABB217 /* JITOperations.h */; settings = {ATTRIBUTES = (Private, ); }; };
    189                 0F24E54F17EE274900ABB217 /* TempRegisterSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54817EE274900ABB217 /* TempRegisterSet.h */; settings = {ATTRIBUTES = (Private, ); }; };
    190189                0F24E55217EE274900ABB217 /* ScratchRegisterAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; };
    191190                0F24E55617F0B71C00ABB217 /* InlineCallFrameSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E55417F0B71C00ABB217 /* InlineCallFrameSet.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    26032602                0F24E54517EE274900ABB217 /* JITOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITOperations.cpp; sourceTree = "<group>"; };
    26042603                0F24E54617EE274900ABB217 /* JITOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITOperations.h; sourceTree = "<group>"; };
    2605                 0F24E54817EE274900ABB217 /* TempRegisterSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TempRegisterSet.h; sourceTree = "<group>"; };
    26062604                0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScratchRegisterAllocator.h; sourceTree = "<group>"; };
    26072605                0F24E55317F0B71C00ABB217 /* InlineCallFrameSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InlineCallFrameSet.cpp; sourceTree = "<group>"; };
     
    31923190                0FC20CB818556A3500C9E954 /* DFGSSALoweringPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGSSALoweringPhase.h; path = dfg/DFGSSALoweringPhase.h; sourceTree = "<group>"; };
    31933191                0FC314101814559100033232 /* RegisterSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterSet.h; sourceTree = "<group>"; };
    3194                 0FC314111814559100033232 /* TempRegisterSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TempRegisterSet.cpp; sourceTree = "<group>"; };
    31953192                0FC3141418146D7000033232 /* RegisterSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterSet.cpp; sourceTree = "<group>"; };
    31963193                0FC3CCF519ADA410006AC72A /* DFGBlockMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGBlockMap.h; path = dfg/DFGBlockMap.h; sourceTree = "<group>"; };
     
    66736670                                DC7997811CDE9F9E004D4A09 /* TagRegistersMode.cpp */,
    66746671                                DC7997821CDE9F9E004D4A09 /* TagRegistersMode.h */,
    6675                                 0FC314111814559100033232 /* TempRegisterSet.cpp */,
    6676                                 0F24E54817EE274900ABB217 /* TempRegisterSet.h */,
    66776672                                0F572D4D16879FDB00E57FBD /* ThunkGenerator.h */,
    66786673                                A7386552118697B400540279 /* ThunkGenerators.cpp */,
     
    1116311158                                E30E8A5726DE2E4800DA4915 /* TemporalTimeZoneConstructor.h in Headers */,
    1116411159                                E30E8A5426DE2E4800DA4915 /* TemporalTimeZonePrototype.h in Headers */,
    11165                                 0F24E54F17EE274900ABB217 /* TempRegisterSet.h in Headers */,
    1116611160                                0F44A7B420BF68D90022B171 /* TerminatedCodeOrigin.h in Headers */,
    1116711161                                0FA2C17C17D7CF84009D015F /* TestRunnerUtils.h in Headers */,
  • trunk/Source/JavaScriptCore/Sources.txt

    r293176 r293203  
    675675jit/SlowPathCall.cpp
    676676jit/TagRegistersMode.cpp
    677 jit/TempRegisterSet.cpp
    678677jit/ThunkGenerators.cpp
    679678
  • trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp

    r292929 r293203  
    313313                        MacroAssembler::TrustedImm32(callSiteIndex.bits()),
    314314                        CCallHelpers::tagFor(VirtualRegister(CallFrameSlot::argumentCountIncludingThis)));
    315                     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm->topEntryFrame);
     315                    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm->topEntryFrame, GPRInfo::argumentGPR0);
    316316
    317317                    jit.move(CCallHelpers::TrustedImmPtr(jit.codeBlock()), GPRInfo::argumentGPR0);
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp

    r293176 r293203  
    12971297}
    12981298
    1299 void AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const TempRegisterSet& usedRegisters)
     1299void AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const RegisterSet& usedRegisters)
    13001300{
    13011301#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
    13021302    // Copy saved calleeSaves on stack or unsaved calleeSaves in register to vm calleeSave buffer
    1303     GPRReg destBufferGPR = usedRegisters.getFreeGPR(0);
    1304     GPRReg temp1 = usedRegisters.getFreeGPR(1);
    1305     FPRReg fpTemp1 = usedRegisters.getFreeFPR(0);
    1306     GPRReg temp2 = usedRegisters.getFreeGPR(2);
    1307     FPRReg fpTemp2 = usedRegisters.getFreeFPR(1);
     1303    ScratchRegisterAllocator allocator(usedRegisters);
     1304    GPRReg destBufferGPR = allocator.allocateScratchGPR();
     1305    GPRReg temp1 = allocator.allocateScratchGPR();
     1306    FPRReg fpTemp1 = allocator.allocateScratchFPR();
     1307    GPRReg temp2 = allocator.allocateScratchGPR();
     1308    FPRReg fpTemp2 = allocator.allocateScratchFPR();
     1309    RELEASE_ASSERT(!allocator.didReuseRegisters());
    13081310
    13091311    loadPtr(&topEntryFrame, destBufferGPR);
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h

    r293176 r293203  
    4141#include "RegisterAtOffsetList.h"
    4242#include "RegisterSet.h"
     43#include "ScratchRegisterAllocator.h"
    4344#include "StackAlignment.h"
    4445#include "TagRegistersMode.h"
     
    394395    }
    395396
    396     void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame)
    397     {
    398 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
    399         const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() };
    400         GPRReg temp1 = usedRegisters.getFreeGPR(0);
    401         copyCalleeSavesToEntryFrameCalleeSavesBuffer(topEntryFrame, temp1);
    402 #else
    403         UNUSED_PARAM(topEntryFrame);
    404         UNUSED_PARAM(topEntryFrame);
    405 #endif
    406     }
    407    
    408397    void copyCalleeSavesToEntryFrameCalleeSavesBuffer(GPRReg topEntryFrame)
    409398    {
     
    419408    void restoreCalleeSavesFromVMEntryFrameCalleeSavesBufferImpl(GPRReg entryFrame, const RegisterSet& skipList);
    420409
    421     void copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*&, const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() });
     410    void copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*&, const RegisterSet& usedRegisters = RegisterSet::stubUnavailableRegisters());
    422411
    423412    void emitMaterializeTagCheckRegisters()
  • trunk/Source/JavaScriptCore/jit/RegisterSet.h

    r293176 r293203  
    3131#include "MacroAssembler.h"
    3232#include "Reg.h"
    33 #include "TempRegisterSet.h"
    3433#include <wtf/Bitmap.h>
    3534
  • trunk/Source/JavaScriptCore/jit/ScratchRegisterAllocator.cpp

    r293176 r293203  
    4747    if (reg == InvalidGPRReg)
    4848        return;
    49     unsigned index = GPRInfo::toIndex(reg);
    50     if (index == GPRInfo::InvalidIndex)
    51         return;
    52     m_lockedRegisters.setGPRByIndex(index);
     49    m_lockedRegisters.set(reg);
    5350}
    5451
     
    5754    if (reg == InvalidFPRReg)
    5855        return;
    59     unsigned index = FPRInfo::toIndex(reg);
    60     if (index == FPRInfo::InvalidIndex)
    61         return;
    62     m_lockedRegisters.setFPRByIndex(index);
     56    m_lockedRegisters.set(reg);
    6357}
    6458
     
    7468    // First try to allocate a register that is totally free.
    7569    for (unsigned i = 0; i < BankInfo::numberOfRegisters; ++i) {
    76         typename BankInfo::RegisterType reg = BankInfo::toRegister(i);
     70        auto reg = BankInfo::toRegister(i);
    7771        if (!m_lockedRegisters.get(reg)
    7872            && !m_usedRegisters.get(reg)
     
    8680    // locked or used for scratch.
    8781    for (unsigned i = 0; i < BankInfo::numberOfRegisters; ++i) {
    88         typename BankInfo::RegisterType reg = BankInfo::toRegister(i);
     82        auto reg = BankInfo::toRegister(i);
    8983        if (!m_lockedRegisters.get(reg) && !m_scratchRegisters.get(reg)) {
    9084            m_scratchRegisters.set(reg);
     
    111105    for (unsigned i = 0; i < FPRInfo::numberOfRegisters; ++i) {
    112106        FPRReg reg = FPRInfo::toRegister(i);
    113         if (m_scratchRegisters.getFPRByIndex(i) && m_usedRegisters.get(reg))
     107        ASSERT(reg != InvalidFPRReg);
     108        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
    114109            registersToSpill.set(reg);
    115110    }
    116111    for (unsigned i = 0; i < GPRInfo::numberOfRegisters; ++i) {
    117112        GPRReg reg = GPRInfo::toRegister(i);
    118         if (m_scratchRegisters.getGPRByIndex(i) && m_usedRegisters.get(reg))
     113        ASSERT(reg != InvalidGPRReg);
     114        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
    119115            registersToSpill.set(reg);
    120116    }
     
    135131    for (unsigned i = GPRInfo::numberOfRegisters; i--;) {
    136132        GPRReg reg = GPRInfo::toRegister(i);
    137         if (m_scratchRegisters.getGPRByIndex(i) && m_usedRegisters.get(reg))
     133        ASSERT(reg != InvalidGPRReg);
     134        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
    138135            registersToFill.set(reg);
    139136    }
    140137    for (unsigned i = FPRInfo::numberOfRegisters; i--;) {
    141138        FPRReg reg = FPRInfo::toRegister(i);
    142         if (m_scratchRegisters.getFPRByIndex(i) && m_usedRegisters.get(reg))
     139        ASSERT(reg != InvalidFPRReg);
     140        if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg))
    143141            registersToFill.set(reg);
    144142    }
  • trunk/Source/JavaScriptCore/jit/ScratchRegisterAllocator.h

    r293176 r293203  
    2929
    3030#include "RegisterSet.h"
    31 #include "TempRegisterSet.h"
    3231
    3332namespace JSC {
     
    9796private:
    9897    RegisterSet m_usedRegisters;
    99     TempRegisterSet m_lockedRegisters;
    100     TempRegisterSet m_scratchRegisters;
     98    RegisterSet m_lockedRegisters;
     99    RegisterSet m_scratchRegisters;
    101100    unsigned m_numberOfReusedRegisters;
    102101};
  • trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp

    r293041 r293203  
    4747    CCallHelpers jit;
    4848
    49     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     49    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0);
    5050
    5151    jit.move(CCallHelpers::TrustedImmPtr(&vm), GPRInfo::argumentGPR0);
     
    6363    CCallHelpers jit;
    6464
    65     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     65    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0);
    6666
    6767    jit.move(CCallHelpers::TrustedImmPtr(&vm), GPRInfo::argumentGPR0);
     
    154154    jit.preserveReturnAddressAfterCall(GPRInfo::nonPreservedNonReturnGPR);
    155155
    156     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     156    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0);
    157157
    158158    jit.setupArguments<decltype(operationLookupExceptionHandler)>(CCallHelpers::TrustedImmPtr(&vm));
     
    466466    exceptionHandler.link(&jit);
    467467
    468     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     468    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0);
    469469    jit.storePtr(JSInterfaceJIT::callFrameRegister, &vm.topCallFrame);
    470470#if OS(WINDOWS)
     
    13401340
    13411341    // Throw Stack Overflow exception
    1342     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     1342    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::regT3);
    13431343    jit.loadPtr(CCallHelpers::Address(GPRInfo::regT0, JSBoundFunction::offsetOfScopeChain()), GPRInfo::regT3);
    13441344    jit.setupArguments<decltype(operationThrowStackOverflowErrorFromThunk)>(GPRInfo::regT3);
     
    14691469
    14701470    // Throw Stack Overflow exception
    1471     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     1471    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::regT3);
    14721472    jit.loadPtr(CCallHelpers::Address(GPRInfo::regT0, JSBoundFunction::offsetOfScopeChain()), GPRInfo::regT3);
    14731473    jit.setupArguments<decltype(operationThrowStackOverflowErrorFromThunk)>(GPRInfo::regT3);
     
    16171617
    16181618    exceptionChecks.link(&jit);
    1619     jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     1619    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0);
    16201620    jit.setupArguments<decltype(operationLookupExceptionHandler)>(CCallHelpers::TrustedImmPtr(&vm));
    16211621    jit.prepareCallOperation(vm);
  • trunk/Source/JavaScriptCore/wasm/js/WasmToJS.cpp

    r292773 r293203  
    406406    if (!exceptionChecks.empty()) {
    407407        exceptionChecks.link(&jit);
    408         jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame);
     408        jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0);
    409409        jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
    410410        auto call = jit.call(OperationPtrTag);
Note: See TracChangeset for help on using the changeset viewer.