Chromium Code Reviews| Index: src/IceCfg.cpp |
| diff --git a/src/IceCfg.cpp b/src/IceCfg.cpp |
| index 7e915081700eec8a629c7d3f2fdbc61aba98a43c..9e99d162d80d962adae1c9bbd5b28709197c8b6f 100644 |
| --- a/src/IceCfg.cpp |
| +++ b/src/IceCfg.cpp |
| @@ -26,6 +26,9 @@ |
| #include "IceOperand.h" |
| #include "IceTargetLowering.h" |
| +#include <list> |
| +#include <unordered_set> |
| + |
| namespace Ice { |
| ICE_TLS_DEFINE_FIELD(const Cfg *, Cfg, CurrentCfg); |
| @@ -332,6 +335,44 @@ void Cfg::reorderNodes() { |
| assert(Nodes.size() == OldSize); |
| } |
| +namespace { |
| +void getRandomReversedPostOrder(CfgNode *Node, |
| + std::unordered_set<const CfgNode *> &Visited, |
| + std::list<CfgNode *> &ReversePostOrder, |
| + Ice::RandomNumberGenerator *RNG) { |
| + assert(Visited.count(Node) == 0); |
| + Visited.insert(Node); |
| + NodeList Outs = Node->getOutEdges(); |
| + Ice::RandomShuffle(Outs.begin(), Outs.end(), |
| + [RNG](int N) { return RNG->next(N); }); |
| + for (CfgNode *Next : Outs) { |
| + if (Visited.count(Next) == 0) |
| + getRandomReversedPostOrder(Next, Visited, ReversePostOrder, RNG); |
| + } |
| + ReversePostOrder.push_front(Node); |
| +} |
| +} |
|
Jim Stichnoth
2015/07/30 16:30:50
add "// end of anonymous namespace" comment
qining
2015/07/30 20:25:54
Done.
|
| + |
| +void Cfg::shuffleNodes() { |
| + std::list<CfgNode *> NewList; |
|
Jim Stichnoth
2015/07/30 16:30:50
Can you use CfgNodeList instead of list<CfgNode*>?
qining
2015/07/30 20:25:55
Done.
|
| + std::unordered_set<const CfgNode *> Visited; |
|
Jim Stichnoth
2015/07/30 16:30:51
Can you just make Visited an llvm::BitVector, inde
qining
2015/07/30 20:25:55
Done. Change Visited to ToVisit. True bits mean no
|
| + Visited.clear(); |
| + getRandomReversedPostOrder(getEntryNode(), Visited, NewList, &Ctx->getRNG()); |
| + for (auto *Node : Nodes) |
| + if (Visited.find(Node) == Visited.end()) |
| + NewList.push_back(Node); |
| + |
| + // Copy the layout list to the Nodes. |
| + SizeT OldSize = Nodes.size(); |
| + (void)OldSize; |
| + Nodes.clear(); |
| + while (!NewList.empty()) { |
| + Nodes.emplace_back(NewList.front()); |
| + NewList.pop_front(); |
| + } |
| + assert(Nodes.size() == OldSize); |
| +} |
| + |
| void Cfg::doArgLowering() { |
| TimerMarker T(TimerStack::TT_doArgLowering, this); |
| getTarget()->lowerArguments(); |