• fpizlo@apple.com's avatar
    Infer one-time scopes · 1a72409c
    fpizlo@apple.com authored
    https://bugs.webkit.org/show_bug.cgi?id=124812
    
    Source/JavaScriptCore: 
    
    Reviewed by Oliver Hunt.
            
    This detects JSActivations that are created only once. The JSActivation pointer is then
    baked into the machine code.
            
    This takes advantage of the one-time scope inference to reduce the number of
    indirections needed to get to a closure variable in case where the scope is only
    allocated once. This isn't really a speed-up since in the common case the total number
    of instruction bytes needed to load the scope from the stack is about equal to the
    number of instruction bytes needed to materialize the absolute address of a scoped
    variable. But, this is a necessary prerequisite to
    https://bugs.webkit.org/show_bug.cgi?id=124630, so it's probably a good idea anyway.
    
    * bytecode/CodeBlock.cpp:
    (JSC::CodeBlock::dumpBytecode):
    (JSC::CodeBlock::CodeBlock):
    (JSC::CodeBlock::finalizeUnconditionally):
    * bytecode/Instruction.h:
    * bytecode/Opcode.h:
    (JSC::padOpcodeName):
    * bytecode/Watchpoint.h:
    (JSC::WatchpointSet::notifyWrite):
    (JSC::InlineWatchpointSet::notifyWrite):
    * bytecompiler/BytecodeGenerator.cpp:
    (JSC::BytecodeGenerator::emitResolveScope):
    * dfg/DFGAbstractInterpreterInlines.h:
    (JSC::DFG::::executeEffects):
    * dfg/DFGByteCodeParser.cpp:
    (JSC::DFG::ByteCodeParser::parseBlock):
    * dfg/DFGCSEPhase.cpp:
    (JSC::DFG::CSEPhase::scopedVarLoadElimination):
    (JSC::DFG::CSEPhase::scopedVarStoreElimination):
    (JSC::DFG::CSEPhase::getLocalLoadElimination):
    (JSC::DFG::CSEPhase::setLocalStoreElimination):
    * dfg/DFGClobberize.h:
    (JSC::DFG::clobberize):
    * dfg/DFGFixupPhase.cpp:
    (JSC::DFG::FixupPhase::fixupNode):
    * dfg/DFGGraph.cpp:
    (JSC::DFG::Graph::tryGetRegisters):
    * dfg/DFGGraph.h:
    * dfg/DFGNode.h:
    (JSC::DFG::Node::varNumber):
    (JSC::DFG::Node::hasSymbolTable):
    (JSC::DFG::Node::symbolTable):
    * dfg/DFGNodeType.h:
    * 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/DFGWatchpointCollectionPhase.cpp:
    (JSC::DFG::WatchpointCollectionPhase::handle):
    * ftl/FTLCapabilities.cpp:
    (JSC::FTL::canCompile):
    * ftl/FTLLowerDFGToLLVM.cpp:
    (JSC::FTL::LowerDFGToLLVM::compileNode):
    (JSC::FTL::LowerDFGToLLVM::compileGetClosureRegisters):
    * llint/LowLevelInterpreter32_64.asm:
    * llint/LowLevelInterpreter64.asm:
    * runtime/JSActivation.h:
    (JSC::JSActivation::create):
    * runtime/JSScope.cpp:
    (JSC::abstractAccess):
    (JSC::JSScope::abstractResolve):
    * runtime/JSScope.h:
    (JSC::ResolveOp::ResolveOp):
    * runtime/JSVariableObject.h:
    (JSC::JSVariableObject::registers):
    * runtime/SymbolTable.cpp:
    (JSC::SymbolTable::SymbolTable):
    * runtime/SymbolTable.h:
    
    LayoutTests: 
    
    Reviewed by Oliver Hunt.
    
    * js/regress/infer-one-time-closure-expected.txt: Added.
    * js/regress/infer-one-time-closure-ten-vars-expected.txt: Added.
    * js/regress/infer-one-time-closure-ten-vars.html: Added.
    * js/regress/infer-one-time-closure-two-vars-expected.txt: Added.
    * js/regress/infer-one-time-closure-two-vars.html: Added.
    * js/regress/infer-one-time-closure.html: Added.
    * js/regress/infer-one-time-deep-closure-expected.txt: Added.
    * js/regress/infer-one-time-deep-closure.html: Added.
    * js/regress/script-tests/infer-one-time-closure-ten-vars.js: Added.
    * js/regress/script-tests/infer-one-time-closure-two-vars.js: Added.
    * js/regress/script-tests/infer-one-time-closure.js: Added.
    * js/regress/script-tests/infer-one-time-deep-closure.js: Added.
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@159834 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    1a72409c
DFGByteCodeParser.cpp 164 KB