Ignore:
Timestamp:
Jun 14, 2018, 2:48:02 PM (7 years ago)
Author:
[email protected]
Message:

REGRESSION(232741): Crash running ARES-6
https://bugs.webkit.org/show_bug.cgi?id=186630

Reviewed by Saam Barati.

The de-duplicating work in r232741 caused a bug in breakCriticalEdge() where it
treated edges between identical predecessor->successor pairs independently.
This fixes the issue by handling such edges once, using the added intermediate
pad for all instances of the edges between the same pairs.

  • dfg/DFGCriticalEdgeBreakingPhase.cpp:

(JSC::DFG::CriticalEdgeBreakingPhase::run):
(JSC::DFG::CriticalEdgeBreakingPhase::breakCriticalEdge): Deleted.

File:
1 edited

Legend:

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

    r204466 r232856  
    5757            if (block->numSuccessors() <= 1)
    5858                continue;
    59            
     59
     60            // Break critical edges by inserting a "Jump" pad block in place of each
     61            // unique A->B critical edge.
     62            HashMap<BasicBlock*, BasicBlock*> successorPads;
     63
    6064            for (unsigned i = block->numSuccessors(); i--;) {
    6165                BasicBlock** successor = &block->successor(i);
    6266                if ((*successor)->predecessors.size() <= 1)
    6367                    continue;
    64                
    65                 breakCriticalEdge(block, successor);
     68
     69                BasicBlock* pad = nullptr;
     70                auto iter = successorPads.find(*successor);
     71
     72                if (iter == successorPads.end()) {
     73                    pad = m_insertionSet.insertBefore(*successor, (*successor)->executionCount);
     74                    pad->appendNode(
     75                        m_graph, SpecNone, Jump, (*successor)->at(0)->origin, OpInfo(*successor));
     76                    pad->predecessors.append(block);
     77                    (*successor)->replacePredecessor(block, pad);
     78                    successorPads.set(*successor, pad);
     79                } else
     80                    pad = iter->value;
     81
     82                *successor = pad;
    6683            }
    6784        }
     
    7188
    7289private:
    73     void breakCriticalEdge(BasicBlock* predecessor, BasicBlock** successor)
    74     {
    75         BasicBlock* pad = m_insertionSet.insertBefore(*successor, (*successor)->executionCount);
    76         pad->appendNode(
    77             m_graph, SpecNone, Jump, (*successor)->at(0)->origin, OpInfo(*successor));
    78         pad->predecessors.append(predecessor);
    79         (*successor)->replacePredecessor(predecessor, pad);
    80        
    81         *successor = pad;
    82     }
    83    
    8490    BlockInsertionSet m_insertionSet;
    8591};
Note: See TracChangeset for help on using the changeset viewer.