Ignore:
Timestamp:
Jul 24, 2013, 9:04:51 PM (12 years ago)
Author:
[email protected]
Message:

fourthTier: NaturalLoops should be able to quickly answer questions like "what loops own this basic block"
https://bugs.webkit.org/show_bug.cgi?id=118750

Source/JavaScriptCore:

Reviewed by Mark Hahnenberg.

  • dfg/DFGBasicBlock.h:

(BasicBlock):

  • dfg/DFGNaturalLoops.cpp:

(JSC::DFG::NaturalLoops::compute):
(JSC::DFG::NaturalLoops::loopsOf):

  • dfg/DFGNaturalLoops.h:

(DFG):
(JSC::DFG::NaturalLoop::NaturalLoop):
(NaturalLoop):
(JSC::DFG::NaturalLoop::index):
(JSC::DFG::NaturalLoop::isOuterMostLoop):
(JSC::DFG::NaturalLoop::addBlock):
(JSC::DFG::NaturalLoops::headerOf):
(JSC::DFG::NaturalLoops::innerMostLoopOf):
(NaturalLoops):
(JSC::DFG::NaturalLoops::innerMostOuterLoop):

  • dfg/DFGPlan.cpp:

(JSC::DFG::Plan::compileInThreadImpl):

Source/WTF:

Reviewed by Mark Hahnenberg.

Add a utility function for inserting an element into a vector that has bounded size,
and where the insertion causes things to drop off the end.

  • wtf/StdLibExtras.h:

(WTF):
(WTF::insertIntoBoundedVector):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGNaturalLoops.h

    r153267 r153277  
    3737namespace JSC { namespace DFG {
    3838
     39class NaturalLoops;
     40
    3941class NaturalLoop {
    4042public:
    4143    NaturalLoop()
    4244        : m_header(0)
     45        , m_outerLoopIndex(UINT_MAX)
    4346    {
    4447    }
    4548   
    46     NaturalLoop(BasicBlock* header)
     49    NaturalLoop(BasicBlock* header, unsigned index)
    4750        : m_header(header)
     51        , m_outerLoopIndex(UINT_MAX)
     52        , m_index(index)
    4853    {
    4954    }
    50    
    51     void addBlock(BasicBlock* block) { m_body.append(block); }
    5255   
    5356    BasicBlock* header() const { return m_header; }
     
    6669        return false;
    6770    }
     71
     72    // The index of this loop in NaturalLoops.
     73    unsigned index() const { return m_index; }
     74   
     75    bool isOuterMostLoop() const { return m_outerLoopIndex == UINT_MAX; }
    6876   
    6977    void dump(PrintStream&) const;
    7078private:
     79    friend class NaturalLoops;
     80   
     81    void addBlock(BasicBlock* block) { m_body.append(block); }
     82   
    7183    BasicBlock* m_header;
    7284    Vector<BasicBlock*, 4> m_body;
     85    unsigned m_outerLoopIndex;
     86    unsigned m_index;
    7387};
    7488
     
    95109    const NaturalLoop* headerOf(BasicBlock* block) const
    96110    {
    97         for (unsigned i = m_loops.size(); i--;) {
    98             if (m_loops[i].header() == block)
    99                 return &m_loops[i];
     111        const NaturalLoop* loop = innerMostLoopOf(block);
     112        if (loop->header() == block)
     113            return loop;
     114        if (!ASSERT_DISABLED) {
     115            for (; loop; loop = innerMostOuterLoop(*loop))
     116                ASSERT(loop->header() != block);
    100117        }
    101118        return 0;
     119    }
     120   
     121    const NaturalLoop* innerMostLoopOf(BasicBlock* block) const
     122    {
     123        unsigned index = block->innerMostLoopIndices[0];
     124        if (index == UINT_MAX)
     125            return 0;
     126        return &m_loops[index];
     127    }
     128   
     129    const NaturalLoop* innerMostOuterLoop(const NaturalLoop& loop) const
     130    {
     131        if (loop.m_outerLoopIndex == UINT_MAX)
     132            return 0;
     133        return &m_loops[loop.m_outerLoopIndex];
    102134    }
    103135   
Note: See TracChangeset for help on using the changeset viewer.