Chromium Code Reviews| Index: src/IceCfg.cpp |
| diff --git a/src/IceCfg.cpp b/src/IceCfg.cpp |
| index 7e915081700eec8a629c7d3f2fdbc61aba98a43c..1ff88f07a1c893578503eb99a179a42eb7829980 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 { |
| +template <class NodeType> |
| +void getRandomReversedPostOrder(NodeType *Node, |
|
John
2015/07/29 17:52:36
Does this need to be a template? It seems NodeType
qining
2015/07/29 23:04:40
Done, change to a normal function.
|
| + std::unordered_set<const NodeType *> &Visited, |
| + std::list<NodeType *> &ReversePostOrder, |
| + Ice::RandomNumberGenerator *RNG) { |
| + if (Visited.find(Node) != Visited.end()) |
|
John
2015/07/29 17:52:36
Just a thought...
You are calling this method, an
qining
2015/07/29 23:04:40
I think your code is faster, I've changed to this,
|
| + return; |
| + Visited.insert(Node); |
| + NodeList Outs = Node->getOutEdges(); |
| + Ice::RandomShuffle(Outs.begin(), Outs.end(), |
| + [&](int N) { return RNG->next(N); }); |
|
John
2015/07/29 17:52:36
please do not use default capture (especially by r
qining
2015/07/29 23:04:40
Done.
|
| + for (auto *Next : Outs) { |
|
John
2015/07/29 17:52:36
Just a personal preference, but use
CfgNode *
in
qining
2015/07/29 23:04:40
Done.
|
| + getRandomReversedPostOrder(Next, Visited, ReversePostOrder, RNG); |
| + } |
| + ReversePostOrder.push_front(Node); |
| +} |
| +} |
| + |
| +void Cfg::shuffleNodes() { |
| + std::list<CfgNode *> NewList; |
| + std::unordered_set<const CfgNode *> Visited; |
| + Visited.clear(); |
| + getRandomReversedPostOrder<CfgNode>(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(); |
| + for (CfgNode *Node : NewList) |
|
John
2015/07/29 17:52:36
This is probably not a big deal, but you're traver
qining
2015/07/29 23:04:40
Done.
|
| + Nodes.push_back(Node); |
| + assert(Nodes.size() == OldSize); |
| +} |
| + |
| void Cfg::doArgLowering() { |
| TimerMarker T(TimerStack::TT_doArgLowering, this); |
| getTarget()->lowerArguments(); |