diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-10-15 09:45:50 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-10-15 09:45:50 +0000 |
| commit | e15dd966d523731101f70ccf768bba12435a0208 (patch) | |
| tree | ae9cb828a24ded2585a41af3f21411523b47897d /Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp | |
| download | WebKitGtk-tarball-e15dd966d523731101f70ccf768bba12435a0208.tar.gz | |
webkitgtk-2.10.2webkitgtk-2.10.2
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp')
| -rw-r--r-- | Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp b/Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp new file mode 100644 index 000000000..e5e133d43 --- /dev/null +++ b/Source/JavaScriptCore/dfg/DFGVirtualRegisterAllocationPhase.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2011, 2013 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "DFGVirtualRegisterAllocationPhase.h" + +#if ENABLE(DFG_JIT) + +#include "DFGGraph.h" +#include "DFGScoreBoard.h" +#include "JSCInlines.h" +#include "StackAlignment.h" +#include <wtf/StdLibExtras.h> + +namespace JSC { namespace DFG { + +class VirtualRegisterAllocationPhase : public Phase { +public: + VirtualRegisterAllocationPhase(Graph& graph) + : Phase(graph, "virtual register allocation") + { + } + + bool run() + { + DFG_ASSERT(m_graph, nullptr, m_graph.m_form == ThreadedCPS); + + ScoreBoard scoreBoard(m_graph.m_nextMachineLocal); + scoreBoard.assertClear(); + for (size_t blockIndex = 0; blockIndex < m_graph.numBlocks(); ++blockIndex) { + BasicBlock* block = m_graph.block(blockIndex); + if (!block) + continue; + if (!block->isReachable) + continue; + if (!ASSERT_DISABLED) { + // Force usage of highest-numbered virtual registers. + scoreBoard.sortFree(); + } + for (size_t indexInBlock = 0; indexInBlock < block->size(); ++indexInBlock) { + Node* node = block->at(indexInBlock); + + if (!node->shouldGenerate()) + continue; + + switch (node->op()) { + case Phi: + case Flush: + case PhantomLocal: + continue; + case GetLocal: + ASSERT(!node->child1()->hasResult()); + break; + default: + break; + } + + // 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()) + continue; + + VirtualRegister virtualRegister = scoreBoard.allocate(); + node->setVirtualRegister(virtualRegister); + // 'mustGenerate' nodes have their useCount artificially elevated, + // call use now to account for this. + if (node->mustGenerate()) + scoreBoard.use(node); + } + scoreBoard.assertClear(); + } + + // Record the number of virtual registers we're using. This is used by calls + // to figure out where to put the parameters. + m_graph.m_nextMachineLocal = scoreBoard.highWatermark(); + + return true; + } +}; + +bool performVirtualRegisterAllocation(Graph& graph) +{ + SamplingRegion samplingRegion("DFG Virtual Register Allocation Phase"); + return runPhase<VirtualRegisterAllocationPhase>(graph); +} + +} } // namespace JSC::DFG + +#endif // ENABLE(DFG_JIT) |
