Chromium Code Reviews| Index: src/IceCfg.cpp |
| diff --git a/src/IceCfg.cpp b/src/IceCfg.cpp |
| index 3a5aa1e646528bcdce303de81a324ad367633c77..5fbd89829b251e540b132ebb3e164fcc0eb35475 100644 |
| --- a/src/IceCfg.cpp |
| +++ b/src/IceCfg.cpp |
| @@ -643,41 +643,29 @@ void Cfg::localCSE() { |
| void Cfg::loopInvariantCodeMotion() { |
| TimerMarker T(TimerStack::TT_loopInvariantCodeMotion, this); |
| // Does not introduce new nodes as of now. |
| - for (auto &Pair : LoopInfo) { |
| - CfgNode *Header = Nodes[Pair.first]; |
| + Loops.forEachLoop([&](SizeT HeaderIndex, const CfgUnorderedSet<SizeT> &Body) { |
|
John
2016/07/15 21:13:30
no default capture by ref.
also, can you do somet
manasijm
2016/07/18 22:27:46
Done.
|
| + CfgNode *Header = Nodes[HeaderIndex]; |
| assert(Header); |
| if (Header->getLoopNestDepth() < 1) |
| - continue; |
| - CfgNode *PreHeader = nullptr; |
| - for (auto *Pred : Header->getInEdges()) { |
| - if (Pred->getLoopNestDepth() == Header->getLoopNestDepth() - 1) { |
| - if (PreHeader == nullptr) { |
| - PreHeader = Pred; |
| - } else { |
| - PreHeader = nullptr; |
| - break; |
| - // Do not consider cases with two incoming edges. |
| - // Will require insertion of nodes. |
| - } |
| - } |
| - } |
| + return; |
| + CfgNode *PreHeader = Loops.getPreHeader(Header); |
| if (PreHeader == nullptr || PreHeader->getInsts().size() == 0) { |
| - continue; // to next loop |
| + return; // try next loop |
| } |
| auto &Insts = PreHeader->getInsts(); |
| auto &LastInst = Insts.back(); |
| Insts.pop_back(); |
| - for (auto *Inst : findLoopInvariantInstructions(Pair.first)) { |
| + for (auto *Inst : findLoopInvariantInstructions(Body)) { |
| PreHeader->appendInst(Inst); |
| } |
| PreHeader->appendInst(&LastInst); |
| - } |
| + }); |
| } |
| -Ice::CfgVector<Inst *> |
| -Cfg::findLoopInvariantInstructions(Ice::SizeT LoopHeaderIndex) { |
| +CfgVector<Inst *> |
| +Cfg::findLoopInvariantInstructions(const CfgUnorderedSet<SizeT> &Body) { |
| CfgUnorderedSet<Inst *> InvariantInsts; |
| CfgUnorderedSet<Variable *> InvariantVars; |
| for (auto *Var : getArgs()) { |
| @@ -686,7 +674,7 @@ Cfg::findLoopInvariantInstructions(Ice::SizeT LoopHeaderIndex) { |
| bool Changed = false; |
| do { |
| Changed = false; |
| - for (auto NodeIndex : LoopInfo[LoopHeaderIndex]) { |
| + for (auto NodeIndex : Body) { |
| auto *Node = Nodes[NodeIndex]; |
| CfgVector<std::reference_wrapper<Inst>> Insts(Node->getInsts().begin(), |
| Node->getInsts().end()); |
| @@ -1437,7 +1425,7 @@ void Cfg::genFrame() { |
| void Cfg::generateLoopInfo() { |
| TimerMarker T(TimerStack::TT_computeLoopNestDepth, this); |
| - LoopInfo = LoopAnalyzer(this).getLoopInfo(); |
| + Loops = LoopAnalyzer(this).getLoopInfo(); |
| } |
| // This is a lightweight version of live-range-end calculation. Marks the last |