Ignore:
Timestamp:
Sep 12, 2011, 10:35:53 PM (14 years ago)
Author:
[email protected]
Message:

JavaScriptCore does not have baseline->speculative OSR
https://bugs.webkit.org/show_bug.cgi?id=67920

Reviewed by Oliver Hunt.

This adds the ability to on-stack-replace (OSR) from code that is
running hot in the old JIT to code compiled by the new JIT. This
ensures that long-running loops benefit from DFG optimization.
It also ensures that if code experiences a speculation failure
in DFG code, it has an opportunity to reenter the DFG once every
1,000 loop iterations or so.

This results in a 2.88x speed-up on Kraken/imaging-desaturate,
and is a pure win on the main three benchmark suites (SunSpider,
V8, Kraken), when tiered compilation is enabled.

(JSC::CodeBlock::dump):
(JSC::CodeBlock::CodeBlock):
(JSC::ProgramCodeBlock::compileOptimized):
(JSC::EvalCodeBlock::compileOptimized):
(JSC::FunctionCodeBlock::compileOptimized):

  • bytecode/CodeBlock.h:
  • bytecode/Opcode.h:
  • bytecode/PredictedType.h: Added.

(JSC::isCellPrediction):
(JSC::isArrayPrediction):
(JSC::isInt32Prediction):
(JSC::isDoublePrediction):
(JSC::isNumberPrediction):
(JSC::isBooleanPrediction):
(JSC::isStrongPrediction):
(JSC::predictionToString):
(JSC::mergePredictions):
(JSC::mergePrediction):
(JSC::makePrediction):

  • bytecode/PredictionTracker.h: Added.

(JSC::operandIsArgument):
(JSC::PredictionSlot::PredictionSlot):
(JSC::PredictionTracker::PredictionTracker):
(JSC::PredictionTracker::initializeSimilarTo):
(JSC::PredictionTracker::copyLocalsFrom):
(JSC::PredictionTracker::numberOfArguments):
(JSC::PredictionTracker::numberOfVariables):
(JSC::PredictionTracker::argumentIndexForOperand):
(JSC::PredictionTracker::predictArgument):
(JSC::PredictionTracker::predict):
(JSC::PredictionTracker::predictGlobalVar):
(JSC::PredictionTracker::getArgumentPrediction):
(JSC::PredictionTracker::getPrediction):
(JSC::PredictionTracker::getGlobalVarPrediction):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::emitLoopHint):

  • bytecompiler/BytecodeGenerator.h:
  • bytecompiler/NodesCodegen.cpp:

(JSC::DoWhileNode::emitBytecode):
(JSC::WhileNode::emitBytecode):
(JSC::ForNode::emitBytecode):
(JSC::ForInNode::emitBytecode):

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::parseBlock):

  • dfg/DFGCapabilities.h:

(JSC::DFG::canCompileOpcode):

  • dfg/DFGDriver.cpp:

(JSC::DFG::compile):

  • dfg/DFGGraph.cpp:

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

  • dfg/DFGGraph.h:

(JSC::DFG::BasicBlock::BasicBlock):
(JSC::DFG::Graph::predict):
(JSC::DFG::Graph::getPrediction):

  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::exitSpeculativeWithOSR):
(JSC::DFG::JITCompiler::compileEntry):
(JSC::DFG::JITCompiler::compileBody):

  • dfg/DFGJITCompiler.h:

(JSC::DFG::JITCompiler::noticeOSREntry):

  • dfg/DFGNode.h:
  • dfg/DFGOSREntry.cpp: Added.

(JSC::DFG::predictionIsValid):
(JSC::DFG::prepareOSREntry):

  • dfg/DFGOSREntry.h: Added.

(JSC::DFG::prepareOSREntry):

  • dfg/DFGPredictionTracker.h: Removed.
  • dfg/DFGPropagator.cpp:

(JSC::DFG::Propagator::mergeUse):
(JSC::DFG::Propagator::mergePrediction):

  • dfg/DFGSpeculativeJIT.cpp:

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

  • jit/CompactJITCodeMap.h:

(JSC::CompactJITCodeMap::numberOfEntries):
(JSC::CompactJITCodeMap::decode):
(JSC::CompactJITCodeMap::Decoder::Decoder):
(JSC::CompactJITCodeMap::Decoder::numberOfEntriesRemaining):
(JSC::CompactJITCodeMap::Decoder::read):

  • jit/JIT.cpp:

(JSC::JIT::emitOptimizationCheck):
(JSC::JIT::emitTimeoutCheck):
(JSC::JIT::privateCompileMainPass):

  • jit/JIT.h:

(JSC::JIT::emit_op_loop_hint):

  • jit/JITStubs.cpp:

(JSC::DEFINE_STUB_FUNCTION):

  • runtime/Executable.cpp:

(JSC::EvalExecutable::compileInternal):
(JSC::ProgramExecutable::compileInternal):
(JSC::FunctionExecutable::compileForCallInternal):
(JSC::FunctionExecutable::compileForConstructInternal):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp

    r94802 r95016  
    10771077            break;
    10781078        }
     1079        case op_loop_hint: {
     1080            printf("[%4d] loop_hint\n", location);
     1081            break;
     1082        }
    10791083        case op_switch_imm: {
    10801084            int tableIndex = (++it)->u.operand;
     
    14061410    : m_globalObject(globalObject->globalData(), ownerExecutable, globalObject)
    14071411    , m_heap(&m_globalObject->globalData().heap)
    1408     , m_executeCounter(-1000) // trigger optimization when sign bit clears
    14091412    , m_numCalleeRegisters(0)
    14101413    , m_numVars(0)
     
    14281431{
    14291432    ASSERT(m_source);
     1433   
     1434    optimizeAfterWarmUp();
    14301435
    14311436#if DUMP_CODE_BLOCK_STATISTICS
     
    19021907JSObject* ProgramCodeBlock::compileOptimized(ExecState* exec, ScopeChainNode* scopeChainNode)
    19031908{
    1904     if (replacement()->getJITType() == JITCode::nextTierJIT(getJITType())) {
    1905         // No OSR yet, so make sure we don't hit this again anytime soon.
    1906         dontOptimizeAnytimeSoon();
     1909    if (replacement()->getJITType() == JITCode::nextTierJIT(getJITType()))
    19071910        return 0;
    1908     }
    19091911    JSObject* error = static_cast<ProgramExecutable*>(ownerExecutable())->compileOptimized(exec, scopeChainNode);
    19101912    return error;
     
    19131915JSObject* EvalCodeBlock::compileOptimized(ExecState* exec, ScopeChainNode* scopeChainNode)
    19141916{
    1915     if (replacement()->getJITType() == JITCode::nextTierJIT(getJITType())) {
    1916         // No OSR yet, so make sure we don't hit this again anytime soon.
    1917         dontOptimizeAnytimeSoon();
     1917    if (replacement()->getJITType() == JITCode::nextTierJIT(getJITType()))
    19181918        return 0;
    1919     }
    19201919    JSObject* error = static_cast<EvalExecutable*>(ownerExecutable())->compileOptimized(exec, scopeChainNode);
    19211920    return error;
     
    19241923JSObject* FunctionCodeBlock::compileOptimized(ExecState* exec, ScopeChainNode* scopeChainNode)
    19251924{
    1926     if (replacement()->getJITType() == JITCode::nextTierJIT(getJITType())) {
    1927         // No OSR yet, so make sure we don't hit this again anytime soon.
    1928         dontOptimizeAnytimeSoon();
     1925    if (replacement()->getJITType() == JITCode::nextTierJIT(getJITType()))
    19291926        return 0;
    1930     }
    19311927    JSObject* error = static_cast<FunctionExecutable*>(ownerExecutable())->compileOptimizedFor(exec, scopeChainNode, m_isConstructor ? CodeForConstruct : CodeForCall);
    19321928    return error;
Note: See TracChangeset for help on using the changeset viewer.