Ignore:
Timestamp:
Sep 13, 2017, 9:21:05 PM (8 years ago)
Author:
[email protected]
Message:

Rolling out r221832: Regresses Speedometer by ~4% and Dromaeo CSS YUI by ~20%.
https://bugs.webkit.org/show_bug.cgi?id=176888
<rdar://problem/34381832>

Not reviewed.

JSTests:

  • stress/op_mod-ConstVar.js:
  • stress/op_mod-VarConst.js:
  • stress/op_mod-VarVar.js:

Source/JavaScriptCore:

  • JavaScriptCore.xcodeproj/project.pbxproj:
  • assembler/MacroAssembler.cpp:

(JSC::stdFunctionCallback):

  • assembler/MacroAssemblerPrinter.cpp:

(JSC::Printer::printCallback):

  • assembler/ProbeContext.h:

(JSC::Probe:: const):
(JSC::Probe::Context::Context):
(JSC::Probe::Context::gpr):
(JSC::Probe::Context::spr):
(JSC::Probe::Context::fpr):
(JSC::Probe::Context::gprName):
(JSC::Probe::Context::sprName):
(JSC::Probe::Context::fprName):
(JSC::Probe::Context::pc):
(JSC::Probe::Context::fp):
(JSC::Probe::Context::sp):
(JSC::Probe::CPUState::gpr const): Deleted.
(JSC::Probe::CPUState::spr const): Deleted.
(JSC::Probe::Context::arg): Deleted.
(JSC::Probe::Context::gpr const): Deleted.
(JSC::Probe::Context::spr const): Deleted.
(JSC::Probe::Context::fpr const): Deleted.

  • assembler/ProbeFrame.h: Removed.
  • assembler/ProbeStack.cpp:

(JSC::Probe::Page::Page):

  • assembler/ProbeStack.h:

(JSC::Probe::Page::get):
(JSC::Probe::Page::set):
(JSC::Probe::Page::physicalAddressFor):
(JSC::Probe::Stack::lowWatermark):
(JSC::Probe::Stack::get):
(JSC::Probe::Stack::set):

  • bytecode/ArithProfile.cpp:
  • bytecode/ArithProfile.h:
  • bytecode/ArrayProfile.h:

(JSC::ArrayProfile::observeArrayMode): Deleted.

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::updateOSRExitCounterAndCheckIfNeedToReoptimize): Deleted.

  • bytecode/CodeBlock.h:

(JSC::CodeBlock::addressOfOSRExitCounter):

  • bytecode/ExecutionCounter.h:

(JSC::ExecutionCounter::hasCrossedThreshold const): Deleted.
(JSC::ExecutionCounter::setNewThresholdForOSRExit): Deleted.

  • bytecode/MethodOfGettingAValueProfile.cpp:

(JSC::MethodOfGettingAValueProfile::reportValue): Deleted.

  • bytecode/MethodOfGettingAValueProfile.h:
  • dfg/DFGDriver.cpp:

(JSC::DFG::compileImpl):

  • dfg/DFGJITCode.cpp:

(JSC::DFG::JITCode::findPC):

  • dfg/DFGJITCode.h:
  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::linkOSRExits):
(JSC::DFG::JITCompiler::link):

  • dfg/DFGOSRExit.cpp:

(JSC::DFG::OSRExit::setPatchableCodeOffset):
(JSC::DFG::OSRExit::getPatchableCodeOffsetAsJump const):
(JSC::DFG::OSRExit::codeLocationForRepatch const):
(JSC::DFG::OSRExit::correctJump):
(JSC::DFG::OSRExit::emitRestoreArguments):
(JSC::DFG::OSRExit::compileOSRExit):
(JSC::DFG::OSRExit::compileExit):
(JSC::DFG::OSRExit::debugOperationPrintSpeculationFailure):
(JSC::DFG::jsValueFor): Deleted.
(JSC::DFG::restoreCalleeSavesFor): Deleted.
(JSC::DFG::saveCalleeSavesFor): Deleted.
(JSC::DFG::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer): Deleted.
(JSC::DFG::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer): Deleted.
(JSC::DFG::saveOrCopyCalleeSavesFor): Deleted.
(JSC::DFG::createDirectArgumentsDuringExit): Deleted.
(JSC::DFG::createClonedArgumentsDuringExit): Deleted.
(JSC::DFG::emitRestoreArguments): Deleted.
(JSC::DFG::OSRExit::executeOSRExit): Deleted.
(JSC::DFG::reifyInlinedCallFrames): Deleted.
(JSC::DFG::adjustAndJumpToTarget): Deleted.
(JSC::DFG::printOSRExit): Deleted.

  • dfg/DFGOSRExit.h:

(JSC::DFG::OSRExitState::OSRExitState): Deleted.

  • dfg/DFGOSRExitCompilerCommon.cpp:
  • dfg/DFGOSRExitCompilerCommon.h:
  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h:
  • dfg/DFGThunks.cpp:

(JSC::DFG::osrExitGenerationThunkGenerator):
(JSC::DFG::osrExitThunkGenerator): Deleted.

  • dfg/DFGThunks.h:
  • jit/AssemblyHelpers.cpp:

(JSC::AssemblyHelpers::debugCall):

  • jit/AssemblyHelpers.h:
  • jit/JITOperations.cpp:
  • jit/JITOperations.h:
  • profiler/ProfilerOSRExit.h:

(JSC::Profiler::OSRExit::incCount): Deleted.

  • runtime/JSCJSValue.h:
  • runtime/JSCJSValueInlines.h:
  • runtime/VM.h:
Location:
trunk/Source/JavaScriptCore/assembler
Files:
1 deleted
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/MacroAssembler.cpp

    r221832 r222009  
    3939static void stdFunctionCallback(Probe::Context& context)
    4040{
    41     auto func = context.arg<const std::function<void(Probe::Context&)>*>();
     41    auto func = static_cast<const std::function<void(Probe::Context&)>*>(context.arg);
    4242    (*func)(context);
    4343}
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerPrinter.cpp

    r221832 r222009  
    176176{
    177177    auto& out = WTF::dataFile();
    178     PrintRecordList& list = *probeContext.arg<PrintRecordList*>();
     178    PrintRecordList& list = *reinterpret_cast<PrintRecordList*>(probeContext.arg);
    179179    for (size_t i = 0; i < list.size(); i++) {
    180180        auto& record = list[i];
  • trunk/Source/JavaScriptCore/assembler/ProbeContext.h

    r221832 r222009  
    4646    inline double& fpr(FPRegisterID);
    4747
    48     template<typename T> T gpr(RegisterID) const;
    49     template<typename T> T spr(SPRegisterID) const;
     48    template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
     49    T gpr(RegisterID) const;
     50    template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr>
     51    T gpr(RegisterID) const;
     52    template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
     53    T spr(SPRegisterID) const;
     54    template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr>
     55    T spr(SPRegisterID) const;
    5056    template<typename T> T fpr(FPRegisterID) const;
    5157
     
    8086}
    8187
    82 template<typename T>
     88template<typename T, typename std::enable_if<std::is_integral<T>::value>::type*>
    8389T CPUState::gpr(RegisterID id) const
    8490{
    8591    CPUState* cpu = const_cast<CPUState*>(this);
    86     auto& from = cpu->gpr(id);
    87     typename std::remove_const<T>::type to { };
    88     std::memcpy(&to, &from, sizeof(to)); // Use std::memcpy to avoid strict aliasing issues.
    89     return to;
    90 }
    91 
    92 template<typename T>
     92    return static_cast<T>(cpu->gpr(id));
     93}
     94
     95template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type*>
     96T CPUState::gpr(RegisterID id) const
     97{
     98    CPUState* cpu = const_cast<CPUState*>(this);
     99    return reinterpret_cast<T>(cpu->gpr(id));
     100}
     101
     102template<typename T, typename std::enable_if<std::is_integral<T>::value>::type*>
    93103T CPUState::spr(SPRegisterID id) const
    94104{
    95105    CPUState* cpu = const_cast<CPUState*>(this);
    96     auto& from = cpu->spr(id);
    97     typename std::remove_const<T>::type to { };
    98     std::memcpy(&to, &from, sizeof(to)); // Use std::memcpy to avoid strict aliasing issues.
    99     return to;
     106    return static_cast<T>(cpu->spr(id));
     107}
     108
     109template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type*>
     110T CPUState::spr(SPRegisterID id) const
     111{
     112    CPUState* cpu = const_cast<CPUState*>(this);
     113    return reinterpret_cast<T>(cpu->spr(id));
    100114}
    101115
     
    192206
    193207    Context(State* state)
    194         : cpu(state->cpu)
    195         , m_state(state)
     208        : m_state(state)
     209        , arg(state->arg)
     210        , cpu(state->cpu)
    196211    { }
    197212
    198     template<typename T>
    199     T arg() { return reinterpret_cast<T>(m_state->arg); }
    200 
    201     uintptr_t& gpr(RegisterID id) { return cpu.gpr(id); }
    202     uintptr_t& spr(SPRegisterID id) { return cpu.spr(id); }
    203     double& fpr(FPRegisterID id) { return cpu.fpr(id); }
    204     const char* gprName(RegisterID id) { return cpu.gprName(id); }
    205     const char* sprName(SPRegisterID id) { return cpu.sprName(id); }
    206     const char* fprName(FPRegisterID id) { return cpu.fprName(id); }
    207 
    208     template<typename T> T gpr(RegisterID id) const { return cpu.gpr<T>(id); }
    209     template<typename T> T spr(SPRegisterID id) const { return cpu.spr<T>(id); }
    210     template<typename T> T fpr(FPRegisterID id) const { return cpu.fpr<T>(id); }
    211 
    212     void*& pc() { return cpu.pc(); }
    213     void*& fp() { return cpu.fp(); }
    214     void*& sp() { return cpu.sp(); }
    215 
    216     template<typename T> T pc() { return cpu.pc<T>(); }
    217     template<typename T> T fp() { return cpu.fp<T>(); }
    218     template<typename T> T sp() { return cpu.sp<T>(); }
     213    uintptr_t& gpr(RegisterID id) { return m_state->cpu.gpr(id); }
     214    uintptr_t& spr(SPRegisterID id) { return m_state->cpu.spr(id); }
     215    double& fpr(FPRegisterID id) { return m_state->cpu.fpr(id); }
     216    const char* gprName(RegisterID id) { return m_state->cpu.gprName(id); }
     217    const char* sprName(SPRegisterID id) { return m_state->cpu.sprName(id); }
     218    const char* fprName(FPRegisterID id) { return m_state->cpu.fprName(id); }
     219
     220    void*& pc() { return m_state->cpu.pc(); }
     221    void*& fp() { return m_state->cpu.fp(); }
     222    void*& sp() { return m_state->cpu.sp(); }
     223
     224    template<typename T> T pc() { return m_state->cpu.pc<T>(); }
     225    template<typename T> T fp() { return m_state->cpu.fp<T>(); }
     226    template<typename T> T sp() { return m_state->cpu.sp<T>(); }
    219227
    220228    Stack& stack()
     
    227235    Stack* releaseStack() { return new Stack(WTFMove(m_stack)); }
    228236
    229     CPUState& cpu;
    230 
    231237private:
    232238    State* m_state;
     239public:
     240    void* arg;
     241    CPUState& cpu;
     242
     243private:
    233244    Stack m_stack;
    234245
  • trunk/Source/JavaScriptCore/assembler/ProbeStack.cpp

    r221832 r222009  
    3636Page::Page(void* baseAddress)
    3737    : m_baseLogicalAddress(baseAddress)
    38     , m_physicalAddressOffset(reinterpret_cast<uint8_t*>(&m_buffer) - reinterpret_cast<uint8_t*>(baseAddress))
    3938{
    4039    memcpy(&m_buffer, baseAddress, s_pageSize);
  • trunk/Source/JavaScriptCore/assembler/ProbeStack.h

    r221832 r222009  
    5757    T get(void* logicalAddress)
    5858    {
    59         void* from = physicalAddressFor(logicalAddress);
    60         typename std::remove_const<T>::type to { };
    61         std::memcpy(&to, from, sizeof(to)); // Use std::memcpy to avoid strict aliasing issues.
    62         return to;
    63     }
    64     template<typename T>
    65     T get(void* logicalBaseAddress, ptrdiff_t offset)
    66     {
    67         return get<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset);
     59        return *physicalAddressFor<T*>(logicalAddress);
    6860    }
    6961
     
    7264    {
    7365        m_dirtyBits |= dirtyBitFor(logicalAddress);
    74         void* to = physicalAddressFor(logicalAddress);
    75         std::memcpy(to, &value, sizeof(T)); // Use std::memcpy to avoid strict aliasing issues.
    76     }
    77     template<typename T>
    78     void set(void* logicalBaseAddress, ptrdiff_t offset, T value)
    79     {
    80         set<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset, value);
     66        *physicalAddressFor<T*>(logicalAddress) = value;
    8167    }
    8268
     
    9581    }
    9682
    97     void* physicalAddressFor(void* logicalAddress)
     83    template<typename T, typename = typename std::enable_if<std::is_pointer<T>::value>::type>
     84    T physicalAddressFor(void* logicalAddress)
    9885    {
    99         return reinterpret_cast<uint8_t*>(logicalAddress) + m_physicalAddressOffset;
     86        uintptr_t offset = reinterpret_cast<uintptr_t>(logicalAddress) & s_pageMask;
     87        void* physicalAddress = reinterpret_cast<uint8_t*>(&m_buffer) + offset;
     88        return reinterpret_cast<T>(physicalAddress);
    10089    }
    10190
     
    10493    void* m_baseLogicalAddress { nullptr };
    10594    uintptr_t m_dirtyBits { 0 };
    106     ptrdiff_t m_physicalAddressOffset;
    10795
    10896    static constexpr size_t s_pageSize = 1024;
     
    133121    Stack(Stack&& other);
    134122
    135     void* lowWatermark()
    136     {
    137         // We use the chunkAddress for the low watermark because we'll be doing write backs
    138         // to the stack in increments of chunks. Hence, we'll treat the lowest address of
    139         // the chunk as the low watermark of any given set address.
    140         return Page::chunkAddressFor(m_lowWatermark);
    141     }
     123    void* lowWatermark() { return m_lowWatermark; }
    142124
    143125    template<typename T>
    144     T get(void* address)
     126    typename std::enable_if<!std::is_same<double, typename std::remove_cv<T>::type>::value, T>::type get(void* address)
    145127    {
    146128        Page* page = pageFor(address);
    147129        return page->get<T>(address);
    148130    }
    149     template<typename T>
    150     T get(void* logicalBaseAddress, ptrdiff_t offset)
    151     {
    152         return get<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset);
    153     }
    154131
    155     template<typename T>
     132    template<typename T, typename = typename std::enable_if<!std::is_same<double, typename std::remove_cv<T>::type>::value>::type>
    156133    void set(void* address, T value)
    157134    {
     
    159136        page->set<T>(address, value);
    160137
    161         if (address < m_lowWatermark)
    162             m_lowWatermark = address;
     138        // We use the chunkAddress for the low watermark because we'll be doing write backs
     139        // to the stack in increments of chunks. Hence, we'll treat the lowest address of
     140        // the chunk as the low watermark of any given set address.
     141        void* chunkAddress = Page::chunkAddressFor(address);
     142        if (chunkAddress < m_lowWatermark)
     143            m_lowWatermark = chunkAddress;
    163144    }
     145
    164146    template<typename T>
    165     void set(void* logicalBaseAddress, ptrdiff_t offset, T value)
     147    typename std::enable_if<std::is_same<double, typename std::remove_cv<T>::type>::value, T>::type get(void* address)
    166148    {
    167         set<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset, value);
     149        Page* page = pageFor(address);
     150        return bitwise_cast<double>(page->get<uint64_t>(address));
     151    }
     152
     153    template<typename T, typename = typename std::enable_if<std::is_same<double, typename std::remove_cv<T>::type>::value>::type>
     154    void set(void* address, double value)
     155    {
     156        set<uint64_t>(address, bitwise_cast<uint64_t>(value));
    168157    }
    169158
Note: See TracChangeset for help on using the changeset viewer.