Ignore:
Timestamp:
Feb 16, 2014, 10:35:32 PM (11 years ago)
Author:
[email protected]
Message:

FTL should inline polymorphic heap accesses
https://bugs.webkit.org/show_bug.cgi?id=128795

Source/JavaScriptCore:

Reviewed by Oliver Hunt.

We now inline GetByIds that we know are pure but polymorphic. They manifest in DFG IR
as MultiGetByOffset, and in LLVM IR as a switch with a basic block for each kind of
read.

2% speed-up on Octane mostly due to a 18% speed-up on deltablue.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dumpBytecode):

  • bytecode/ExitingJITType.cpp: Added.

(WTF::printInternal):

  • bytecode/ExitingJITType.h:
  • bytecode/GetByIdStatus.cpp:

(JSC::GetByIdStatus::computeFromLLInt):
(JSC::GetByIdStatus::computeForChain):
(JSC::GetByIdStatus::computeForStubInfo):
(JSC::GetByIdStatus::computeFor):
(JSC::GetByIdStatus::dump):

  • bytecode/GetByIdStatus.h:

(JSC::GetByIdStatus::GetByIdStatus):
(JSC::GetByIdStatus::numVariants):
(JSC::GetByIdStatus::variants):
(JSC::GetByIdStatus::at):
(JSC::GetByIdStatus::operator[]):

  • bytecode/GetByIdVariant.cpp: Added.

(JSC::GetByIdVariant::dump):
(JSC::GetByIdVariant::dumpInContext):

  • bytecode/GetByIdVariant.h: Added.

(JSC::GetByIdVariant::GetByIdVariant):
(JSC::GetByIdVariant::isSet):
(JSC::GetByIdVariant::operator!):
(JSC::GetByIdVariant::structureSet):
(JSC::GetByIdVariant::chain):
(JSC::GetByIdVariant::specificValue):
(JSC::GetByIdVariant::offset):

  • dfg/DFGAbstractInterpreterInlines.h:

(JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::emitPrototypeChecks):
(JSC::DFG::ByteCodeParser::handleGetById):
(JSC::DFG::ByteCodeParser::parseBlock):

  • dfg/DFGCSEPhase.cpp:

(JSC::DFG::CSEPhase::getByOffsetLoadElimination):
(JSC::DFG::CSEPhase::performNodeCSE):

  • dfg/DFGClobberize.h:

(JSC::DFG::clobberize):

  • dfg/DFGCommon.h:

(JSC::DFG::verboseCompilationEnabled):
(JSC::DFG::logCompilationChanges):
(JSC::DFG::shouldShowDisassembly):

  • dfg/DFGConstantFoldingPhase.cpp:

(JSC::DFG::ConstantFoldingPhase::foldConstants):
(JSC::DFG::ConstantFoldingPhase::emitGetByOffset):

  • dfg/DFGDriver.cpp:

(JSC::DFG::compileImpl):

  • dfg/DFGFixupPhase.cpp:

(JSC::DFG::FixupPhase::fixupNode):

  • dfg/DFGGraph.cpp:

(JSC::DFG::Graph::dump):

  • dfg/DFGGraph.h:

(JSC::DFG::Graph::convertToConstant):

  • dfg/DFGNode.h:

(JSC::DFG::Node::convertToGetByOffset):
(JSC::DFG::Node::hasHeapPrediction):
(JSC::DFG::Node::hasMultiGetByOffsetData):
(JSC::DFG::Node::multiGetByOffsetData):

  • dfg/DFGNodeType.h:
  • dfg/DFGPhase.h:

(JSC::DFG::Phase::graph):
(JSC::DFG::runAndLog):

  • dfg/DFGPlan.cpp:

(JSC::DFG::dumpAndVerifyGraph):
(JSC::DFG::Plan::compileInThread):
(JSC::DFG::Plan::compileInThreadImpl):

  • dfg/DFGPredictionPropagationPhase.cpp:

(JSC::DFG::PredictionPropagationPhase::propagate):

  • dfg/DFGSafeToExecute.h:

(JSC::DFG::safeToExecute):

  • dfg/DFGSpeculativeJIT32_64.cpp:

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

  • dfg/DFGSpeculativeJIT64.cpp:

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

  • dfg/DFGTypeCheckHoistingPhase.cpp:

(JSC::DFG::TypeCheckHoistingPhase::identifyRedundantStructureChecks):
(JSC::DFG::TypeCheckHoistingPhase::identifyRedundantArrayChecks):

  • ftl/FTLCapabilities.cpp:

(JSC::FTL::canCompile):

  • ftl/FTLCompile.cpp:

(JSC::FTL::fixFunctionBasedOnStackMaps):
(JSC::FTL::compile):

  • ftl/FTLLowerDFGToLLVM.cpp:

(JSC::FTL::LowerDFGToLLVM::compileNode):
(JSC::FTL::LowerDFGToLLVM::compileMultiGetByOffset):

  • ftl/FTLState.h:

(JSC::FTL::verboseCompilationEnabled):
(JSC::FTL::showDisassembly):

  • jsc.cpp:

(GlobalObject::finishCreation):
(functionEffectful42):

  • runtime/IntendedStructureChain.cpp:

(JSC::IntendedStructureChain::dump):
(JSC::IntendedStructureChain::dumpInContext):

  • runtime/IntendedStructureChain.h:
  • runtime/Options.cpp:

(JSC::recomputeDependentOptions):

  • runtime/Options.h:
  • tests/stress/fold-multi-get-by-offset-to-get-by-offset-with-watchpoint.js: Added.

(foo):
(bar):

  • tests/stress/fold-multi-get-by-offset-to-get-by-offset.js: Added.

(foo):
(bar):

  • tests/stress/multi-get-by-offset-proto-and-self.js: Added.

(foo):
(Foo):

Source/WTF:

Reviewed by Oliver Hunt.

  • wtf/PrintStream.h:

(WTF::PointerDumpInContext::PointerDumpInContext):
(WTF::PointerDumpInContext::dump):
(WTF::pointerDumpInContext):

LayoutTests:

Reviewed by Oliver Hunt.

  • js/regress/polymorphic-get-by-id-expected.txt: Added.
  • js/regress/polymorphic-get-by-id.html: Added.
  • js/regress/script-tests/polymorphic-get-by-id.js: Added.

(foo):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGNode.h

    r164059 r164207  
    4242#include "DFGNodeType.h"
    4343#include "DFGVariableAccessData.h"
     44#include "GetByIdVariant.h"
    4445#include "JSCJSValue.h"
    4546#include "Operands.h"
     
    5354class Graph;
    5455struct BasicBlock;
     56
     57struct MultiGetByOffsetData {
     58    unsigned identifierNumber;
     59    Vector<GetByIdVariant, 2> variants;
     60};
    5561
    5662struct StructureTransitionData {
     
    407413    void convertToGetByOffset(unsigned storageAccessDataIndex, Edge storage)
    408414    {
    409         ASSERT(m_op == GetById || m_op == GetByIdFlush);
     415        ASSERT(m_op == GetById || m_op == GetByIdFlush || m_op == MultiGetByOffset);
    410416        m_opInfo = storageAccessDataIndex;
    411417        children.setChild2(children.child1());
     
    906912        case Construct:
    907913        case GetByOffset:
     914        case MultiGetByOffset:
    908915        case GetClosureVar:
    909916        case ArrayPop:
     
    10531060        ASSERT(hasStorageAccessData());
    10541061        return m_opInfo;
     1062    }
     1063   
     1064    bool hasMultiGetByOffsetData()
     1065    {
     1066        return op() == MultiGetByOffset;
     1067    }
     1068   
     1069    MultiGetByOffsetData& multiGetByOffsetData()
     1070    {
     1071        return *reinterpret_cast<MultiGetByOffsetData*>(m_opInfo);
    10551072    }
    10561073   
Note: See TracChangeset for help on using the changeset viewer.