Changeset 221703 in webkit for trunk/Source/JavaScriptCore/b3


Ignore:
Timestamp:
Sep 6, 2017, 2:04:25 PM (8 years ago)
Author:
[email protected]
Message:

Air should have a Vector of prologue generators instead of a HashMap representing an optional prologue generator
https://bugs.webkit.org/show_bug.cgi?id=176346

Reviewed by Mark Lam.

  • b3/B3Procedure.cpp:

(JSC::B3::Procedure::Procedure):
(JSC::B3::Procedure::setNumEntrypoints):

  • b3/B3Procedure.h:

(JSC::B3::Procedure::setNumEntrypoints): Deleted.

  • b3/air/AirCode.cpp:

(JSC::B3::Air::defaultPrologueGenerator):
(JSC::B3::Air::Code::Code):
(JSC::B3::Air::Code::setNumEntrypoints):

  • b3/air/AirCode.h:

(JSC::B3::Air::Code::setPrologueForEntrypoint):
(JSC::B3::Air::Code::prologueGeneratorForEntrypoint):
(JSC::B3::Air::Code::setEntrypoints):
(JSC::B3::Air::Code::setEntrypointLabels):

  • b3/air/AirGenerate.cpp:

(JSC::B3::Air::generate):

  • ftl/FTLLowerDFGToB3.cpp:

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

Location:
trunk/Source/JavaScriptCore/b3
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/b3/B3Procedure.cpp

    r219898 r221703  
    5353    , m_code(new Air::Code(*this))
    5454{
     55    m_code->setNumEntrypoints(m_numEntrypoints);
    5556}
    5657
     
    421422}
    422423
     424void Procedure::setNumEntrypoints(unsigned numEntrypoints)
     425{
     426    m_numEntrypoints = numEntrypoints;
     427    m_code->setNumEntrypoints(numEntrypoints);
     428}
     429
    423430} } // namespace JSC::B3
    424431
  • trunk/Source/JavaScriptCore/b3/B3Procedure.h

    r219898 r221703  
    187187   
    188188    unsigned numEntrypoints() const { return m_numEntrypoints; }
    189     void setNumEntrypoints(unsigned numEntrypoints) { m_numEntrypoints = numEntrypoints; }
    190    
     189    JS_EXPORT_PRIVATE void setNumEntrypoints(unsigned);
     190
    191191    // Only call this after code generation is complete. Note that the label for the 0th entrypoint
    192192    // should point to exactly where the code generation cursor was before you started generating
  • trunk/Source/JavaScriptCore/b3/air/AirCode.cpp

    r221602 r221703  
    3131#include "AirCCallSpecial.h"
    3232#include "AirCFG.h"
     33#include "AllowMacroScratchRegisterUsageIf.h"
    3334#include "B3BasicBlockUtils.h"
    3435#include "B3Procedure.h"
     
    3839namespace JSC { namespace B3 { namespace Air {
    3940
     41static void defaultPrologueGenerator(CCallHelpers& jit, Code& code)
     42{
     43    jit.emitFunctionPrologue();
     44    if (code.frameSize()) {
     45        AllowMacroScratchRegisterUsageIf allowScratch(jit, isARM64());
     46        jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), MacroAssembler::stackPointerRegister);
     47    }
     48   
     49    jit.emitSave(code.calleeSaveRegisterAtOffsetList());
     50}
     51
    4052Code::Code(Procedure& proc)
    4153    : m_proc(proc)
    4254    , m_cfg(new CFG(*this))
    4355    , m_lastPhaseName("initial")
     56    , m_defaultPrologueGenerator(createSharedTask<PrologueGeneratorFunction>(&defaultPrologueGenerator))
    4457{
    4558    // Come up with initial orderings of registers. The user may replace this with something else.
     
    295308}
    296309
     310void Code::setNumEntrypoints(unsigned numEntrypoints)
     311{
     312    m_prologueGenerators.clear();
     313    m_prologueGenerators.reserveCapacity(numEntrypoints);
     314    for (unsigned i = 0; i < numEntrypoints; ++i)
     315        m_prologueGenerators.uncheckedAppend(m_defaultPrologueGenerator.copyRef());
     316}
     317
    297318} } } // namespace JSC::B3::Air
    298319
  • trunk/Source/JavaScriptCore/b3/air/AirCode.h

    r221602 r221703  
    172172    // Note: It is only valid to call this function after LowerEntrySwitch.
    173173    std::optional<unsigned> entrypointIndex(BasicBlock*) const;
    174     void setPrologueForEntrypoint(unsigned entrypointIndex, RefPtr<PrologueGenerator> generator)
    175     {
    176         // Note: We allow this to be called even before we set m_entrypoints just for convenience to users of this API.
    177         m_entrypointIndexToGenerator.set(entrypointIndex, generator);
    178     }
    179     RefPtr<PrologueGenerator> prologueGeneratorForEntrypoint(unsigned entrypointIndex)
    180     {
    181         return m_entrypointIndexToGenerator.get(entrypointIndex);
    182     }
     174
     175    // Note: We allow this to be called even before we set m_entrypoints just for convenience to users of this API.
     176    // However, if you call this before setNumEntrypoints, setNumEntrypoints will overwrite this value.
     177    void setPrologueForEntrypoint(unsigned entrypointIndex, Ref<PrologueGenerator>&& generator)
     178    {
     179        m_prologueGenerators[entrypointIndex] = WTFMove(generator);
     180    }
     181    const Ref<PrologueGenerator>& prologueGeneratorForEntrypoint(unsigned entrypointIndex)
     182    {
     183        return m_prologueGenerators[entrypointIndex];
     184    }
     185
     186    void setNumEntrypoints(unsigned);
    183187
    184188    // This is used by lowerEntrySwitch().
     
    187191    {
    188192        m_entrypoints = std::forward<Vector>(vector);
     193        RELEASE_ASSERT(m_entrypoints.size() == m_prologueGenerators.size());
    189194    }
    190195   
     
    199204    {
    200205        m_entrypointLabels = std::forward<Vector>(vector);
     206        RELEASE_ASSERT(m_entrypointLabels.size() == m_prologueGenerators.size());
    201207    }
    202208   
     
    369375    Vector<FrequentedBlock> m_entrypoints; // This is empty until after lowerEntrySwitch().
    370376    Vector<CCallHelpers::Label> m_entrypointLabels; // This is empty until code generation.
    371     HashMap<unsigned, RefPtr<PrologueGenerator>, WTF::IntHash<unsigned>, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> m_entrypointIndexToGenerator;
     377    Vector<Ref<PrologueGenerator>, 1> m_prologueGenerators;
    372378    RefPtr<WasmBoundsCheckGenerator> m_wasmBoundsCheckGenerator;
    373379    const char* m_lastPhaseName;
    374380    std::unique_ptr<Disassembler> m_disassembler;
    375381    unsigned m_optLevel { defaultOptLevel() };
     382    Ref<PrologueGenerator> m_defaultPrologueGenerator;
    376383};
    377384
  • trunk/Source/JavaScriptCore/b3/air/AirGenerate.cpp

    r221602 r221703  
    4747#include "AirSimplifyCFG.h"
    4848#include "AirValidate.h"
    49 #include "AllowMacroScratchRegisterUsageIf.h"
    5049#include "B3Common.h"
    5150#include "B3Procedure.h"
     
    215214                disassembler->startEntrypoint(jit);
    216215
    217             if (RefPtr<PrologueGenerator> prologueGenerator = code.prologueGeneratorForEntrypoint(*entrypointIndex))
    218                 prologueGenerator->run(jit, code);
    219             else {
    220                 jit.emitFunctionPrologue();
    221                 if (code.frameSize()) {
    222                     AllowMacroScratchRegisterUsageIf allowScratch(jit, isARM64());
    223                     jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), MacroAssembler::stackPointerRegister);
    224                 }
    225                
    226                 jit.emitSave(code.calleeSaveRegisterAtOffsetList());
    227             }
     216            code.prologueGeneratorForEntrypoint(*entrypointIndex)->run(jit, code);
    228217
    229218            if (disassembler)
Note: See TracChangeset for help on using the changeset viewer.