Changeset 95786 in webkit


Ignore:
Timestamp:
Sep 22, 2011 11:59:38 PM (13 years ago)
Author:
fpizlo@apple.com
Message:

GetScopedVar should have value profiling
https://bugs.webkit.org/show_bug.cgi?id=68676

Reviewed by Oliver Hunt.

Added GetScopedVar value profiling and predictin propagation.
Added GetScopeChain to CSE.

  • dfg/DFGByteCodeParser.cpp:

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

  • dfg/DFGGraph.h:

(JSC::DFG::Graph::predict):

  • dfg/DFGNode.h:

(JSC::DFG::Node::hasPrediction):

  • dfg/DFGPropagator.cpp:

(JSC::DFG::Propagator::propagateNodePredictions):
(JSC::DFG::Propagator::getScopeChainLoadElimination):
(JSC::DFG::Propagator::performNodeCSE):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_get_scoped_var):

Location:
trunk/Source/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r95779 r95786  
     12011-09-22  Filip Pizlo  <fpizlo@apple.com>
     2
     3        GetScopedVar should have value profiling
     4        https://bugs.webkit.org/show_bug.cgi?id=68676
     5
     6        Reviewed by Oliver Hunt.
     7       
     8        Added GetScopedVar value profiling and predictin propagation.
     9        Added GetScopeChain to CSE.
     10
     11        * dfg/DFGByteCodeParser.cpp:
     12        (JSC::DFG::ByteCodeParser::parseBlock):
     13        * dfg/DFGGraph.h:
     14        (JSC::DFG::Graph::predict):
     15        * dfg/DFGNode.h:
     16        (JSC::DFG::Node::hasPrediction):
     17        * dfg/DFGPropagator.cpp:
     18        (JSC::DFG::Propagator::propagateNodePredictions):
     19        (JSC::DFG::Propagator::getScopeChainLoadElimination):
     20        (JSC::DFG::Propagator::performNodeCSE):
     21        * jit/JITPropertyAccess.cpp:
     22        (JSC::JIT::emit_op_get_scoped_var):
     23
    1242011-09-22  Filip Pizlo  <fpizlo@apple.com>
    225
  • trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

    r95758 r95786  
    11201120            int depth = currentInstruction[3].u.operand;
    11211121            NodeIndex getScopeChain = addToGraph(GetScopeChain, OpInfo(depth));
    1122             NodeIndex getScopedVar = addToGraph(GetScopedVar, OpInfo(slot), getScopeChain);
     1122            NodeIndex getScopedVar = addToGraph(GetScopedVar, OpInfo(slot), OpInfo(PredictNone), getScopeChain);
    11231123            set(dst, getScopedVar);
     1124            stronglyPredict(getScopedVar);
    11241125            NEXT_OPCODE(op_get_scoped_var);
    11251126        }
  • trunk/Source/JavaScriptCore/dfg/DFGGraph.h

    r95666 r95786  
    197197        case Construct:
    198198        case GetByOffset:
     199        case GetScopedVar:
    199200            return node.predict(prediction, source);
    200201        default:
  • trunk/Source/JavaScriptCore/dfg/DFGNode.h

    r95758 r95786  
    625625        case Construct:
    626626        case GetByOffset:
     627        case GetScopedVar:
    627628            return true;
    628629        default:
  • trunk/Source/JavaScriptCore/dfg/DFGPropagator.cpp

    r95758 r95786  
    472472            changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
    473473            if (isStrongPrediction(node.getPrediction()))
    474                 changed |= setPrediction(node.getPrediction());
     474                changed |= mergePrediction(node.getPrediction());
    475475            break;
    476476        }
     
    490490            changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
    491491            if (isStrongPrediction(node.getPrediction()))
    492                 changed |= setPrediction(node.getPrediction());
     492                changed |= mergePrediction(node.getPrediction());
    493493            break;
    494494        }
     
    505505            changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
    506506            if (isStrongPrediction(node.getPrediction()))
    507                 changed |= setPrediction(node.getPrediction());
     507                changed |= mergePrediction(node.getPrediction());
    508508            break;
    509509        }
     
    528528        }
    529529           
     530        case GetScopedVar: {
     531            changed |= node.predict(m_uses[m_compileIndex] & ~PredictionTagMask, StrongPrediction);
     532            PredictedType prediction = node.getPrediction();
     533            if (isStrongPrediction(prediction))
     534                changed |= mergePrediction(prediction);
     535            break;
     536        }
     537           
     538        case GetScopeChain: {
     539            changed |= setPrediction(makePrediction(PredictCellOther, StrongPrediction));
     540            break;
     541        }
     542           
    530543        case PutByVal:
    531544        case PutByValAlias:
     
    536549        }
    537550
    538         case GetScopeChain:
    539551        case GetCallee: {
    540552            changed |= setPrediction(makePrediction(PredictObjectOther, StrongPrediction));
     
    588600        case ResolveBase:
    589601        case ResolveBaseStrictPut:
    590         case GetScopedVar:
    591602            break;
    592603           
     
    977988    }
    978989   
     990    NodeIndex getScopeChainLoadElimination(unsigned depth)
     991    {
     992        NodeIndex start = startIndexForChildren();
     993        for (NodeIndex index = endIndexForPureCSE(); index-- > start;) {
     994            Node& node = m_graph[index];
     995            if (node.op == GetScopeChain
     996                && node.scopeChainDepth() == depth)
     997                return index;
     998        }
     999        return NoNode;
     1000    }
     1001   
    9791002    void performSubstitution(NodeIndex& child)
    9801003    {
     
    10681091            break;
    10691092           
     1093        case GetScopeChain:
     1094            setReplacement(getScopeChainLoadElimination(node.scopeChainDepth()));
     1095            break;
     1096
    10701097        // Handle nodes that are conditionally pure: these are pure, and can
    10711098        // be CSE'd, so long as the prediction is the one we want.
  • trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp

    r95447 r95786  
    966966    loadPtr(Address(regT0, JSVariableObject::offsetOfRegisters()), regT0);
    967967    loadPtr(Address(regT0, currentInstruction[2].u.operand * sizeof(Register)), regT0);
     968    emitValueProfilingSite(FirstProfilingSite);
    968969    emitPutVirtualRegister(currentInstruction[1].u.operand);
    969970}
Note: See TracChangeset for help on using the changeset viewer.