Traverses the CFG in reverse postorder and create a loop object for every block having a back edge.
(&mut self, cfg: &ControlFlowGraph, domtree: &DominatorTree)
| 201 | // Traverses the CFG in reverse postorder and create a loop object for every block having a |
| 202 | // back edge. |
| 203 | fn find_loop_headers(&mut self, cfg: &ControlFlowGraph, domtree: &DominatorTree) { |
| 204 | for &block in domtree |
| 205 | .cfg_rpo() |
| 206 | .filter(|&&block| Self::is_block_loop_header(block, cfg, domtree)) |
| 207 | { |
| 208 | // This block is a loop header, so we create its associated loop |
| 209 | let lp = self.loops.push(LoopData::new(block, None)); |
| 210 | self.block_loop_map[block] = lp.into(); |
| 211 | } |
| 212 | } |
| 213 | |
| 214 | // Intended to be called after `find_loop_headers`. For each detected loop header, |
| 215 | // discovers all the block belonging to the loop and its inner loops. After a call to this |