Ignore:
Timestamp:
Sep 13, 2012, 7:17:01 PM (13 years ago)
Author:
[email protected]
Message:

Refactored the DFG to make fewer assumptions about variable capture
https://bugs.webkit.org/show_bug.cgi?id=96680

Reviewed by Gavin Barraclough.

A variable capture optimization patch I'm working on broke DFG
correctness and the arguments simplification optimization phase, so I've
refactored both to make fewer assumptions about variable capture.

  • bytecode/CodeBlock.h:

(JSC::CodeBlock::isCaptured): This is the new One True Way to find out
if a variable was captured. This gives us a single point of maintenance
as we chagne capture behavior.

  • dfg/DFGAbstractState.cpp:

(JSC::DFG::AbstractState::clobberCapturedVars): Don't assume that captured
variables have any particular location. Instead, ask the One True Function.

  • dfg/DFGArgumentsSimplificationPhase.cpp:

(JSC::DFG::ArgumentsSimplificationPhase::run):
(JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse):
(JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): Mechanical
changes to separate being captured from being 'arguments'. What used
to be

if (captured)

if (arguments)

x

y

is now

if (arguments)

x
y

else if (captured)

y

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::getLocal):
(JSC::DFG::ByteCodeParser::setLocal):
(JSC::DFG::ByteCodeParser::getArgument):
(JSC::DFG::ByteCodeParser::setArgument):
(JSC::DFG::ByteCodeParser::flushDirect):
(JSC::DFG::ByteCodeParser::parseBlock):
(JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compile): Use the One True Function.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

    r128534 r128544  
    194194    {
    195195        NodeIndex nodeIndex = m_currentBlock->variablesAtTail.local(operand);
    196         bool isCaptured = m_codeBlock->localIsCaptured(m_inlineStackTop->m_inlineCallFrame, operand);
     196        bool isCaptured = m_codeBlock->isCaptured(operand, m_inlineStackTop->m_inlineCallFrame);
    197197       
    198198        if (nodeIndex != NoNode) {
     
    254254    void setLocal(unsigned operand, NodeIndex value, SetMode setMode = NormalSet)
    255255    {
    256         bool isCaptured = m_codeBlock->localIsCaptured(m_inlineStackTop->m_inlineCallFrame, operand);
     256        bool isCaptured = m_codeBlock->isCaptured(operand, m_inlineStackTop->m_inlineCallFrame);
    257257       
    258258        if (setMode == NormalSet) {
     
    273273    {
    274274        unsigned argument = operandToArgument(operand);
    275        
    276         bool isCaptured = m_codeBlock->argumentIsCaptured(argument);
    277        
    278275        ASSERT(argument < m_numArguments);
    279276       
    280277        NodeIndex nodeIndex = m_currentBlock->variablesAtTail.argument(argument);
     278        bool isCaptured = m_codeBlock->isCaptured(operand);
    281279
    282280        if (nodeIndex != NoNode) {
     
    340338    {
    341339        unsigned argument = operandToArgument(operand);
    342         bool isCaptured = m_codeBlock->argumentIsCaptured(argument);
    343        
    344340        ASSERT(argument < m_numArguments);
    345341       
     342        bool isCaptured = m_codeBlock->isCaptured(operand);
     343
    346344        // Always flush arguments, except for 'this'.
    347345        if (argument && setMode == NormalSet)
     
    403401        // some other local variable.
    404402       
    405         bool isCaptured = m_codeBlock->isCaptured(m_inlineStackTop->m_inlineCallFrame, operand);
     403        bool isCaptured = m_codeBlock->isCaptured(operand, m_inlineStackTop->m_inlineCallFrame);
    406404       
    407405        ASSERT(operand < FirstConstantRegisterIndex);
     
    17741772        for (unsigned argument = 0; argument < m_numArguments; ++argument) {
    17751773            VariableAccessData* variable = newVariableAccessData(
    1776                 argumentToOperand(argument), m_codeBlock->argumentIsCaptured(argument));
     1774                argumentToOperand(argument), m_codeBlock->isCaptured(argumentToOperand(argument)));
    17771775            variable->mergeStructureCheckHoistingFailed(
    17781776                m_inlineStackTop->m_exitProfile.hasExitSite(m_currentIndex, BadCache));
     
    31913189            inlineCallFrame.capturedVars = inlineCallFrame.caller.inlineCallFrame->capturedVars;
    31923190        else {
    3193             for (int i = byteCodeParser->m_codeBlock->m_numCapturedVars; i--;)
    3194                 inlineCallFrame.capturedVars.set(i);
    3195         }
    3196        
    3197         if (codeBlock->argumentsAreCaptured()) {
    3198             for (int i = argumentCountIncludingThis; i--;)
     3191            for (int i = byteCodeParser->m_codeBlock->m_numVars; i--;) {
     3192                if (byteCodeParser->m_codeBlock->isCaptured(i))
     3193                    inlineCallFrame.capturedVars.set(i);
     3194            }
     3195        }
     3196
     3197        for (int i = argumentCountIncludingThis; i--;) {
     3198            if (codeBlock->isCaptured(argumentToOperand(i)))
    31993199                inlineCallFrame.capturedVars.set(argumentToOperand(i) + inlineCallFrame.stackOffset);
    32003200        }
    3201         for (int i = codeBlock->m_numCapturedVars; i--;)
    3202             inlineCallFrame.capturedVars.set(i + inlineCallFrame.stackOffset);
    3203        
     3201        for (size_t i = codeBlock->m_numVars; i--;) {
     3202            if (codeBlock->isCaptured(i))
     3203                inlineCallFrame.capturedVars.set(i + inlineCallFrame.stackOffset);
     3204        }
     3205
    32043206#if DFG_ENABLE(DEBUG_VERBOSE)
    32053207        dataLog("Current captured variables: ");
Note: See TracChangeset for help on using the changeset viewer.