| 103 | } |
| 104 | |
| 105 | void CFG::ForEachBlockInPostOrder(BasicBlock* bb, |
| 106 | const std::function<void(BasicBlock*)>& f) { |
| 107 | std::vector<BasicBlock*> po; |
| 108 | std::unordered_set<BasicBlock*> seen; |
| 109 | ComputePostOrderTraversal(bb, &po, &seen); |
| 110 | |
| 111 | for (BasicBlock* current_bb : po) { |
| 112 | if (!IsPseudoExitBlock(current_bb) && !IsPseudoEntryBlock(current_bb)) { |
| 113 | f(current_bb); |
| 114 | } |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | void CFG::ForEachBlockInReversePostOrder( |
| 119 | BasicBlock* bb, const std::function<void(BasicBlock*)>& f) { |
no outgoing calls