diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-25 15:09:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-25 15:09:11 +0200 |
commit | a89b2ebb8e192c5e8cea21079bda2ee2c0c7dddd (patch) | |
tree | b7abd9f49ae1d4d2e426a5883bfccd42b8e2ee12 /Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp | |
parent | 8d473cf9743f1d30a16a27114e93bd5af5648d23 (diff) | |
download | qtwebkit-a89b2ebb8e192c5e8cea21079bda2ee2c0c7dddd.tar.gz |
Imported WebKit commit eb5c1b8fe4d4b1b90b5137433fc58a91da0e6878 (http://svn.webkit.org/repository/webkit/trunk@118516)
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp b/Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp index 11ac69524..2d7ce33c9 100644 --- a/Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp +++ b/Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp @@ -40,7 +40,7 @@ public: { } - void run() + bool run() { #if DFG_ENABLE(DEBUG_VERBOSE) dataLog("Preserved vars: "); @@ -54,6 +54,10 @@ public: #endif for (size_t blockIndex = 0; blockIndex < m_graph.m_blocks.size(); ++blockIndex) { BasicBlock* block = m_graph.m_blocks[blockIndex].get(); + if (!block) + continue; + if (!block->isReachable) + continue; for (size_t indexInBlock = 0; indexInBlock < block->size(); ++indexInBlock) { NodeIndex nodeIndex = block->at(indexInBlock); #if DFG_ENABLE(DEBUG_PROPAGATION_VERBOSE) @@ -66,22 +70,21 @@ public: if (!node.shouldGenerate() || node.op() == Phi || node.op() == Flush) continue; - - // GetLocal nodes are effectively phi nodes in the graph, referencing - // results from prior blocks. - if (node.op() != GetLocal) { - // First, call use on all of the current node's children, then - // allocate a VirtualRegister for this node. We do so in this - // order so that if a child is on its last use, and a - // VirtualRegister is freed, then it may be reused for node. - if (node.flags() & NodeHasVarArgs) { - for (unsigned childIdx = node.firstChild(); childIdx < node.firstChild() + node.numChildren(); childIdx++) - scoreBoard.use(m_graph.m_varArgChildren[childIdx]); - } else { - scoreBoard.use(node.child1()); - scoreBoard.use(node.child2()); - scoreBoard.use(node.child3()); - } + + if (node.op() == GetLocal) + ASSERT(!m_graph[node.child1()].hasResult()); + + // First, call use on all of the current node's children, then + // allocate a VirtualRegister for this node. We do so in this + // order so that if a child is on its last use, and a + // VirtualRegister is freed, then it may be reused for node. + if (node.flags() & NodeHasVarArgs) { + for (unsigned childIdx = node.firstChild(); childIdx < node.firstChild() + node.numChildren(); childIdx++) + scoreBoard.useIfHasResult(m_graph.m_varArgChildren[childIdx]); + } else { + scoreBoard.useIfHasResult(node.child1()); + scoreBoard.useIfHasResult(node.child2()); + scoreBoard.useIfHasResult(node.child3()); } if (!node.hasResult()) @@ -122,12 +125,14 @@ public: #if DFG_ENABLE(DEBUG_VERBOSE) dataLog("Num callee registers: %u\n", calleeRegisters); #endif + + return true; } }; -void performVirtualRegisterAllocation(Graph& graph) +bool performVirtualRegisterAllocation(Graph& graph) { - runPhase<VirtualRegisterAllocationPhase>(graph); + return runPhase<VirtualRegisterAllocationPhase>(graph); } } } // namespace JSC::DFG |