Ignore:
Timestamp:
Mar 6, 2013, 1:23:39 PM (12 years ago)
Author:
[email protected]
Message:

DFG should not run full CSE after the optimization fixpoint, since it really just wants store elimination
https://bugs.webkit.org/show_bug.cgi?id=111536

Reviewed by Oliver Hunt and Mark Hahnenberg.

The fixpoint will do aggressive load elimination and pure CSE. There's no need to do it after the fixpoint.
On the other hand, the fixpoint does not profit from doing store elimination (except for SetLocal/Flush).
Previously we had CSE do both, and had it avoid doing some store elimination during the fixpoint by querying
the fixpoint state. This changes CSE to be templated on mode - either NormalCSE or StoreElimination - so
that we explicitly put it into one of those modes depending on where we call it from. The goal is to reduce
time spent doing load elimination after the fixpoint, since that is just wasted cycles.

  • dfg/DFGCSEPhase.cpp:

(JSC::DFG::CSEPhase::CSEPhase):
(JSC::DFG::CSEPhase::run):
(JSC::DFG::CSEPhase::performNodeCSE):
(JSC::DFG::CSEPhase::performBlockCSE):
(JSC::DFG::performCSE):
(DFG):
(JSC::DFG::performStoreElimination):

  • dfg/DFGCSEPhase.h:

(DFG):

  • dfg/DFGDriver.cpp:

(JSC::DFG::compile):

File:
1 edited

Legend:

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

    r144939 r144973  
    3636namespace JSC { namespace DFG {
    3737
     38enum CSEMode { NormalCSE, StoreElimination };
     39
     40template<CSEMode cseMode>
    3841class CSEPhase : public Phase {
    3942public:
    4043    CSEPhase(Graph& graph)
    41         : Phase(graph, "common subexpression elimination")
     44        : Phase(graph, cseMode == NormalCSE ? "common subexpression elimination" : "store elimination")
    4245    {
    4346    }
     
    4548    bool run()
    4649    {
     50        ASSERT((cseMode == NormalCSE) == (m_graph.m_fixpointState == FixpointNotConverged));
     51        ASSERT(m_graph.m_fixpointState != BeforeFixpoint);
     52       
    4753        m_changed = false;
    4854       
     
    10121018    void performNodeCSE(Node* node)
    10131019    {
    1014         m_graph.performSubstitution(node);
     1020        if (cseMode == NormalCSE)
     1021            m_graph.performSubstitution(node);
    10151022       
    10161023        if (node->op() == SetLocal)
     
    10331040       
    10341041        case Identity:
     1042            if (cseMode == StoreElimination)
     1043                break;
    10351044            setReplacement(node->child1().node());
    10361045            break;
     
    10701079        case CompareEqConstant:
    10711080        case ValueToInt32:
     1081            if (cseMode == StoreElimination)
     1082                break;
    10721083            setReplacement(pureCSE(node));
    10731084            break;
     
    10751086        case Int32ToDouble:
    10761087        case ForwardInt32ToDouble:
     1088            if (cseMode == StoreElimination)
     1089                break;
    10771090            setReplacement(int32ToDoubleCSE(node));
    10781091            break;
    10791092           
    10801093        case GetCallee:
     1094            if (cseMode == StoreElimination)
     1095                break;
    10811096            setReplacement(getCalleeLoadElimination(node->codeOrigin.inlineCallFrame));
    10821097            break;
    10831098
    10841099        case GetLocal: {
     1100            if (cseMode == StoreElimination)
     1101                break;
    10851102            VariableAccessData* variableAccessData = node->variableAccessData();
    10861103            if (!variableAccessData->isCaptured())
     
    11091126           
    11101127        case GetLocalUnlinked: {
     1128            if (cseMode == StoreElimination)
     1129                break;
    11111130            Node* relevantLocalOpIgnored;
    11121131            setReplacement(getLocalLoadElimination(node->unlinkedLocal(), relevantLocalOpIgnored, true));
     
    11231142            // FIXME: We should be able to remove SetLocals that can exit; we just need
    11241143            // to replace them with appropriate type checks.
    1125             if (m_graph.m_fixpointState == FixpointNotConverged) {
     1144            if (cseMode == NormalCSE) {
    11261145                // Need to be conservative at this time; if the SetLocal has any chance of performing
    11271146                // any speculations then we cannot do anything.
     
    11601179           
    11611180        case JSConstant:
     1181            if (cseMode == StoreElimination)
     1182                break;
    11621183            // This is strange, but necessary. Some phases will convert nodes to constants,
    11631184            // which may result in duplicated constants. We use CSE to clean this up.
     
    11661187           
    11671188        case WeakJSConstant:
     1189            if (cseMode == StoreElimination)
     1190                break;
    11681191            // FIXME: have CSE for weak constants against strong constants and vice-versa.
    11691192            setReplacement(weakConstantCSE(node));
     
    11711194           
    11721195        case GetArrayLength:
     1196            if (cseMode == StoreElimination)
     1197                break;
    11731198            setReplacement(getArrayLengthElimination(node->child1().node()));
    11741199            break;
    11751200
    11761201        case GetMyScope:
     1202            if (cseMode == StoreElimination)
     1203                break;
    11771204            setReplacement(getMyScopeLoadElimination(node->codeOrigin.inlineCallFrame));
    11781205            break;
     
    11861213        case CompareGreaterEq:
    11871214        case CompareEq: {
     1215            if (cseMode == StoreElimination)
     1216                break;
    11881217            if (m_graph.isPredictedNumerical(node)) {
    11891218                Node* replacement = pureCSE(node);
     
    11971226        // optimize them provided that some subtle conditions are met.
    11981227        case GetGlobalVar:
     1228            if (cseMode == StoreElimination)
     1229                break;
    11991230            setReplacement(globalVarLoadElimination(node->registerPointer()));
    12001231            break;
    12011232
    12021233        case GetScopedVar: {
     1234            if (cseMode == StoreElimination)
     1235                break;
    12031236            setReplacement(scopedVarLoadElimination(node->child1().node(), node->varNumber()));
    12041237            break;
     
    12061239
    12071240        case GlobalVarWatchpoint:
     1241            if (cseMode == StoreElimination)
     1242                break;
    12081243            if (globalVarWatchpointElimination(node->registerPointer()))
    12091244                eliminate();
     
    12121247        case PutGlobalVar:
    12131248        case PutGlobalVarCheck:
    1214             if (m_graph.m_fixpointState == FixpointNotConverged)
     1249            if (cseMode == NormalCSE)
    12151250                break;
    12161251            eliminate(globalVarStoreElimination(node->registerPointer()));
     
    12181253           
    12191254        case PutScopedVar: {
    1220             if (m_graph.m_fixpointState == FixpointNotConverged)
     1255            if (cseMode == NormalCSE)
    12211256                break;
    12221257            eliminate(scopedVarStoreElimination(node->child1().node(), node->child2().node(), node->varNumber()));
     
    12251260
    12261261        case GetByVal:
     1262            if (cseMode == StoreElimination)
     1263                break;
    12271264            if (m_graph.byValIsPure(node))
    12281265                setReplacement(getByValLoadElimination(node->child1().node(), node->child2().node()));
     
    12301267           
    12311268        case PutByVal: {
     1269            if (cseMode == StoreElimination)
     1270                break;
    12321271            Edge child1 = m_graph.varArgChild(node, 0);
    12331272            Edge child2 = m_graph.varArgChild(node, 1);
     
    12431282        case CheckStructure:
    12441283        case ForwardCheckStructure:
     1284            if (cseMode == StoreElimination)
     1285                break;
    12451286            if (checkStructureElimination(node->structureSet(), node->child1().node()))
    12461287                eliminate();
     
    12491290        case StructureTransitionWatchpoint:
    12501291        case ForwardStructureTransitionWatchpoint:
     1292            if (cseMode == StoreElimination)
     1293                break;
    12511294            if (structureTransitionWatchpointElimination(node->structure(), node->child1().node()))
    12521295                eliminate();
     
    12541297           
    12551298        case PutStructure:
    1256             if (m_graph.m_fixpointState == FixpointNotConverged)
     1299            if (cseMode == NormalCSE)
    12571300                break;
    12581301            eliminate(putStructureStoreElimination(node->child1().node()), PhantomPutStructure);
     
    12601303
    12611304        case CheckFunction:
     1305            if (cseMode == StoreElimination)
     1306                break;
    12621307            if (checkFunctionElimination(node->function(), node->child1().node()))
    12631308                eliminate();
     
    12651310               
    12661311        case CheckExecutable:
     1312            if (cseMode == StoreElimination)
     1313                break;
    12671314            if (checkExecutableElimination(node->executable(), node->child1().node()))
    12681315                eliminate();
     
    12701317               
    12711318        case CheckArray:
     1319            if (cseMode == StoreElimination)
     1320                break;
    12721321            if (checkArrayElimination(node->child1().node(), node->arrayMode()))
    12731322                eliminate();
     
    12751324           
    12761325        case GetIndexedPropertyStorage: {
     1326            if (cseMode == StoreElimination)
     1327                break;
    12771328            setReplacement(getIndexedPropertyStorageLoadElimination(node->child1().node(), node->arrayMode()));
    12781329            break;
     
    12801331
    12811332        case GetButterfly:
     1333            if (cseMode == StoreElimination)
     1334                break;
    12821335            setReplacement(getPropertyStorageLoadElimination(node->child1().node()));
    12831336            break;
    12841337
    12851338        case GetByOffset:
     1339            if (cseMode == StoreElimination)
     1340                break;
    12861341            setReplacement(getByOffsetLoadElimination(m_graph.m_storageAccessData[node->storageAccessDataIndex()].identifierNumber, node->child1().node()));
    12871342            break;
    12881343           
    12891344        case PutByOffset:
    1290             if (m_graph.m_fixpointState == FixpointNotConverged)
     1345            if (cseMode == NormalCSE)
    12911346                break;
    12921347            eliminate(putByOffsetStoreElimination(m_graph.m_storageAccessData[node->storageAccessDataIndex()].identifierNumber, node->child1().node()));
     
    13511406            performNodeCSE(m_currentNode);
    13521407        }
     1408       
     1409        if (!ASSERT_DISABLED && cseMode == StoreElimination) {
     1410            // Nobody should have replacements set.
     1411            for (unsigned i = 0; i < block->size(); ++i)
     1412                ASSERT(!block->at(i)->replacement);
     1413        }
    13531414    }
    13541415   
     
    13631424{
    13641425    SamplingRegion samplingRegion("DFG CSE Phase");
    1365     return runPhase<CSEPhase>(graph);
     1426    return runPhase<CSEPhase<NormalCSE> >(graph);
    13661427}
    13671428
     1429bool performStoreElimination(Graph& graph)
     1430{
     1431    SamplingRegion samplingRegion("DFG Store Elimination Phase");
     1432    return runPhase<CSEPhase<StoreElimination> >(graph);
     1433}
     1434
    13681435} } // namespace JSC::DFG
    13691436
Note: See TracChangeset for help on using the changeset viewer.