Chromium Code Reviews| Index: src/IceLoopAnalyzer.h |
| diff --git a/src/IceLoopAnalyzer.h b/src/IceLoopAnalyzer.h |
| index 73458fa46aa38ae47b7257b44124644167a19417..67c10e257ff39b318a1ba9e506e75d79f0e93565 100644 |
| --- a/src/IceLoopAnalyzer.h |
| +++ b/src/IceLoopAnalyzer.h |
| @@ -21,11 +21,8 @@ namespace Ice { |
| /// Analyze a function's CFG for loops. The CFG must not change during the |
| /// lifetime of this object. |
| class LoopAnalyzer { |
|
John
2016/07/15 21:13:30
OK, you opened pandora's box... :)
This class is
|
| - LoopAnalyzer() = delete; |
| - LoopAnalyzer(const LoopAnalyzer &) = delete; |
| - LoopAnalyzer &operator=(const LoopAnalyzer &) = delete; |
| - |
| public: |
| + LoopAnalyzer() = default; |
| explicit LoopAnalyzer(Cfg *Func); |
| /// Use Tarjan's strongly connected components algorithm to identify outermost |
| @@ -39,10 +36,38 @@ public: |
| // is bounded linear. ncbray suggests another algorithm which is linear in |
| // practice but not bounded linear. I think it also finds dominators. |
| // http://lenx.100871.net/papers/loop-SAS.pdf |
| - CfgUnorderedMap<SizeT, CfgVector<SizeT>> getLoopInfo() { return Loops; } |
| + // CfgUnorderedMap<SizeT, CfgVector<SizeT>> getLoopInfo() { return Loops; } |
| + class LoopInfo { |
| + public: |
| + LoopInfo() {} |
| + LoopInfo(Cfg *Func, const CfgVector<CfgUnorderedSet<SizeT>> Loops) |
|
John
2016/07/18 15:25:36
A nice way to decrease memory usage: pass Loops by
manasijm
2016/07/18 22:27:47
Should be 'moved' by default in new implementation
|
| + : Func(Func), Loops(Loops) { |
| + computeLoopMetaData(); |
| + }; |
| + |
| + template <typename F> void forEachLoop(F Callback) { |
|
John
2016/07/15 21:13:30
no need for this: just create a getter for LoopInd
manasijm
2016/07/18 22:27:47
Done.
|
| + for (auto Pair : LoopIndexForHeader) { |
| + Callback(Pair.first, Loops[Pair.second]); |
| + } |
| + } |
| + CfgNode *getHeader(CfgNode *Node); |
|
John
2016/07/18 15:25:36
getHeader, and getBody aren't used anywhere. remov
manasijm
2016/07/18 22:27:47
Done.
|
| + CfgNode *getPreHeader(CfgNode *Node); |
| + const CfgUnorderedSet<SizeT> &getBody(CfgNode *Header); |
| + |
| + private: |
| + void computeLoopMetaData(); |
| + Cfg *Func = nullptr; |
| + CfgVector<CfgUnorderedSet<SizeT>> Loops; |
|
John
2016/07/18 15:25:36
How about changing this vector to be a vector of s
|
| + CfgUnorderedMap<SizeT, SizeT> HeaderForNode; |
| + CfgUnorderedMap<SizeT, SizeT> PreheaderForHeader; |
| + /// Stores indices to the Loops array. |
| + CfgUnorderedMap<SizeT, SizeT> LoopIndexForHeader; |
| + }; |
| + LoopInfo getLoopInfo() { return LoopInfo(Func, Loops); } |
| private: |
| void computeLoopNestDepth(); |
| + |
| using IndexT = uint32_t; |
| static constexpr IndexT UndefinedIndex = 0; |
| static constexpr IndexT FirstDefinedIndex = 1; |
| @@ -113,8 +138,9 @@ private: |
| /// The number of nodes which have been marked deleted. This is used to track |
| /// when the iteration should end. |
| LoopNodePtrList::size_type NumDeletedNodes = 0; |
| - /// Detailed loop information |
| - CfgUnorderedMap<SizeT, CfgVector<SizeT>> Loops; |
| + |
| + /// All the Loops, in descending order of size |
| + CfgVector<CfgUnorderedSet<SizeT>> Loops; |
| }; |
| } // end of namespace Ice |